SSHセッションが終了するとPythonバックグラウンドプロセスが終了するのはなぜですか?

SSHセッションが終了するとPythonバックグラウンドプロセスが終了するのはなぜですか?

startup.shコアラインが次のようなpython3スクリプト(と呼ぶ)を起動するbashスクリプトがあります。

nohup python3 -u <script> &

直接入力してこのスクリプトを呼び出すと、sshPythonスクリプトは終了後もバックグラウンドで実行され続けます。しかし、これを実行すると、次のようになります。

ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "./startup.sh"

プロセスは実行が完了し、sshセッションが終了するとすぐに終了します。

2つの違いは何ですか?

編集:PythonスクリプトはBottleを介してWebサービスを実行しています。

EDIT2:私も試してみました。初期化スクリプトの生成を呼び出しstartup.shて実行しましたが、ssh -i <keyfile> -o StrictHostKeyChecking=no <user>@<hostname> "sudo service start <servicename>"同じ動作を示しました。

EDIT3: たぶんスクリプトの他のものかもしれません。以下はスクリプトの大部分です。

chmod 700 ${key_loc}

echo "INFO: Syncing files."
rsync -azP -e "ssh -i ${key_loc} -o StrictHostKeyChecking=no" ${source_client_loc} ${remote_user}@${remote_hostname}:${destination_client_loc}

echo "INFO: Running startup script."
ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart"

EDIT4: 最後の行を実行し、最後に寝ると次のようになります。

ssh -i ${key_loc} -o StrictHostKeyChecking=no ${remote_user}@${remote_hostname} "cd ${destination_client_loc}; chmod u+x ${ctl_script}; ./${ctl_script} restart; sleep 1"

echo "Finished"

決して到着せず、echo "Finished"以前に見たことのないBottle Serverメッセージが表示されます。

Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.

SSH経由で手動でログインしてプロセスを直接終了すると、「完了」と表示されます。

EDIT5:EDIT4を使用してエンドポイントに要求するとページが返されますが、Bottleにエラーが発生します。

Bottle vx.x.x server starting up (using WSGIRefServer())...
Listening on <URL>
Hit Ctrl-C to quit.


----------------------------------------
Exception happened during processing of request from ('<IP>', 55104)

ベストアンサー1

標準入力/出力とエラーストリームからコマンドを切断します。

nohup python3 -u <script> </dev/null >/dev/null 2>&1 &  

sshもはや出力がなく、追加の入力を必要としないインジケータが必要です。他のものを入力として使用し、出力をリダイレクトすることは、ssh入力/出力がターミナルから出てきたり、ターミナルに行かないために終了するのが安全であることを意味します。これは、入力が他の場所から来なければならず、出力(STDOUTとSTDERR)が他の場所から来なければならないことを意味します。

この部分は入力として</dev/null指定されます。これが有用な理由:/dev/null<script>

/dev/nullをstdinにリダイレクトすると、そのプロセスのすべての読み取り呼び出しに対して即時EOFが提供されます。これはttyからプロセスを分離するのによく役立ちます(これらのプロセスをデーモンと呼びます)。たとえば、SSHを介してリモートでバックグラウンドプロセスを開始するときに、プロセスがローカル入力を待たないようにstdinをリダイレクトする必要があります。 https://stackoverflow.com/questions/19955260/what-is-dev-null-in-bash/19955475#19955475

あるいは、ssh現在のセッションが開いている必要がない限り、他の入力ソースからリダイレクトするのは比較的安全でなければなりません。

この>/dev/nullセクションを使用して、シェルは標準出力を/ dev / nullにリダイレクトし、デフォルトでそれを破棄します。>/path/to/file動作します。

最後の部分は2>&1STDERRをSTDOUTにリダイレクトすることです。

プログラムには3つの標準入力および出力ソースがあります。対話型プログラムの場合、標準入力は通常キーボードで提供されます。他のプログラムの出力を処理する場合、標準入力は通常他のプログラムによって提供されます。プログラムは通常、標準出力として印刷し、時には標準エラーで印刷します。これら3つのファイル記述子(「データパイプ」と考えることができます)は、通常STDIN、STDOUT、およびSTDERRと呼ばれます。

時には名前が付けられていませんが、番号が付けられています!組み込みの数字は順番に0、1、2です。デフォルトでは、明示的に名前や番号を最初に指定しない場合は、STDOUTについて話します。

この場合、上記のコマンドが標準出力を/ dev / nullにリダイレクトして、不要なエントリ(しばしばビットバケットと呼ばれる)をダンプできる場所で、標準エラーを標準出力にリダイレクトすることがわかります。目的地の前の&)。

したがって、簡単に説明すると、「このコマンドのすべての出力はブラックホールにプッシュする必要があります」です。これはプログラムを本当に静かにする良い方法です!
> /dev/null 2>&1 どういう意味ですか? Xaprb |

おすすめ記事