なぜ「su -c&"は、コマンドが中断されることなくバックグラウンドで実行されるようにするようです。

なぜ「su -c&

断続的にバックグラウンドプロセスが停止する問題を抱えている同僚を支援しています。

サーバーにログインし、次のコマンドを実行してバックグラウンドプロセスを開始することがわかりました。

su - <user> -c '<command>' &

「ああ」私は叫んだ。 ""&"でコマンドを起動すると、制御端末をシャットダウンすると中断されます。これを達成するにはnohupのようなものを使用する必要があります。プロセスは実際にデーモンとして実行をサポートする必要があります。

私の主張を証明するために上記のコマンドをテストしました。うまくいくようです。プロセスは以下によって実行される。注文する上記のコマンドを実行した端末を終了すると、終了はありません。

注文する出力がファイルに保存されるカスタムPythonスクリプト。私が知っている限り、スクリプトにはスマートな「デーモン」のようなものはありません。デーモンとして実行するために必要な操作は実行されません。Wikipedia:デーモン(コンピューティング):創造ページ。

次のコマンドを実行すると、期待どおりに機能します。

<command> &
exit

上記の例では、バックグラウンドプロセスは次のように実行されます。注文するターミナルを出るときに出てください。

私の質問はこれです:

  1. "su - -c &"を追加すると、端末が終了したときにプロセスが終了するのを防ぎます。端末制御、標準入力、出力などについて詳しく知りたいです。

  2. このコマンドをバックグラウンドプロセスとして実行するという目標を達成するための合理的な方法ですか?そうでなければなぜならないのですか?

私は会社内でベストプラクティスを広めたいと思いますが、私が提案するすべてを実証してサポートできる必要があります。

私も何が起こっているのか理解したいです。

ベストアンサー1

プロセスは、最終終了のためにいくつかの方法で終了できます。

  1. 最初の方法はカーネルのターミナルドライバです。SIGHUP信号を送信到着制御プロセス端末は制御端子。ほとんどの場合、制御プロセスは端末で最初に開始されたシェルであり、制御端末はstdin、stdout、およびstderrが接続されている端末です。プロセスが呼び出されると、制御端末との接続が切断されます。setsid

  2. 2番目の方法は、シェルがSIGHUPを受信すると、そのシグナルをサブプロセス、より正確にはバックグラウンドジョブに戻すことです。一部のシェル(ksh、bash、zsh)には、disownSIGHUPを特定のジョブに送信しないようにシェルに指示するコマンドが組み込まれています。

  3. 端末が消えてプログラムが端末からデータを読み取ろうとすると、ファイルの終了条件(またはバックグラウンドジョブのEIO)について通知されます。ターミナルが消え、プログラムがターミナルに書き込もうとすると、EIOエラーで書込みが返されます。これによりプログラムが終了する可能性があります。

したがって、suここで変更されたのは、(2)は通常、初期シェルがバックグラウンドジョブを終了するのを許可しますが、そのバックグラウンドプロセスが他のユーザーとして実行されているため、シグナルを渡すことができず、バックグラウンドプロセスが存在し続けることです。

おすすめ記事