私はデーモンを生成する方法を読んで理解しましたが、読んだことすべてからまったく理解できませんでした。なぜこれを行う必要があります。
端末制御を取得するプロセスを避けるためにfork-setsid-forkを実行するという内容を読んでいますが、どういう意味ですか? &を使用してバックグラウンドでプログラム(例: './script&')を起動した場合、それがデーモンに変わるプログラムを通常どおり実行するのとは異なり、このプロセスが実行されるのはなぜですか?
これは、ログアウトするとバックグラウンドプロセスが停止し、デーモンが実行され続けるという意味ですか? 「ターミナル制御権の確保」を理解するのは本当に難しいです。
これが私を悩ませる理由は、ロボットに組み込みRPiを開発しているため、起動時にプログラムを起動させる必要があるからです。現在は、次のコマンドを使用してrc.localから起動しますsu user -c 'python /home/user/launcher.py &' &
。起動時にプログラムの起動に問題が発生したことはありませんが(SSHを介してRPiに接続するときに使用されるプロセスも表示されますps -e
)、リスクがあるのか悪い習慣なのか疑問に思います。
答え1
これはただ一つの質問ではありません。すべての質問には長い答えがあります。単に
&を使用してバックグラウンドでプログラム(例: './script&')を起動した場合、それがデーモンに変わるプログラムを通常どおり実行するのとは異なり、このプロセスが実行されるのはなぜですか?
プログラムをバックグラウンドで実行すると、端末から直接制御することはできませんが(単純に制御することはできません
^C
)、端末に書き込んで操作を中断することがあります。通常、デーモンはターミナルからそれ自体で分離され(ポーキングを除く)、出力/エラーがファイルにリダイレクトされます。これは、ログアウトするとバックグラウンドプロセスが停止し、デーモンが実行され続けるという意味ですか?
バックグラウンドプロセスは保護できますが、
nohup
出力がリダイレクトされない限り、端末を閉じると書き込みが防止され、停止する可能性があるエラーが発生します。危険があるのか/これが悪い習慣なのか気になります。
プログラムの出力(およびエラーメッセージ)を追跡する問題に加えて、プログラムが停止した場合に再起動する問題もあります。サービススクリプトは、システムの他のサービスが設計されている方法に適しており、デーモンを制御するためのかなり標準的な方法を提供します。