次のようなbashスクリプトstart.shがあります。
for thing in foo bar; do
{
background_processor $thing
cleanup_on_exit $thing
} &
done
これは私が望むことです: start.sh を実行すると、コード 0 で終了し、2 つのサブシェルがバックグラウンドで実行されます。各サブシェルが実行background_processor
され、それが終了すると実行されcleanup_on_exit
ます。これは、最初に start.sh を実行した端末を終了しても機能します (それが ssh 接続であっても)。
それから私はこれを試しました:
ssh user@host "start.sh"
これは機能しstart.sh
ますが、終了した後、ssh は明らかにサブシェルの終了も待機します。理由がよくわかりません。終了するとstart.sh
、サブシェルは pid 1 の子になり、tty が割り当てられていないため、ssh 接続にどのように関連付けられているのか理解できません。
私は後でこれを試しました:
ssh -t user@host "start.sh"
これで、プロセスに疑似 tty が割り当てられました。現在、ssh が終了するとすぐに終了することがわかりましたstart.sh
が、子プロセスも強制終了されます。
後者の場合、子プロセスに SIGHUP が送信されていると推測したので、次のようにしました。
ssh -t user@host "nohup start.sh"
それは実際に機能します!したがって、私は実際の問題に対する解決策を持っていますが、ここで SIGHUP/tty の微妙な点を把握したいと思います。
要約すると、私の質問は次のとおりです。
start.sh
親の pid が 1 であるにもかかわらず、ssh (-t なし) が終了後も子プロセスを待機するのはなぜですか?- 端末から子プロセスを実行してその端末からログアウトすると発生しないのに、ssh (-t を使用) が明らかに SIGHUP で子プロセスを強制終了するのはなぜですか?