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