ベストアンサー1
bashドキュメントの引用(からman bash
):
JOB CONTROL
Job control refers to the ability to selectively stop
(suspend) the execution of processes and continue (resume)
their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly
by the operating system kernel's terminal driver and bash.
したがって、非常に簡単に(対話型シェルのデフォルト値)を使用すると、set -m
(非対話型シェルのデフォルト値)で無効になる組み込み機能を使用できます。fg
bg
set +m
ただし、ジョブ制御と終了時のバックグラウンドプロセスの終了間の接続は明らかではありませんが、1つがあることを確認できます。set -m; (sleep 10 ; touch control-on) &
そのコマンドを入力した直後にシェルを終了すると、run を実行するとファイルが生成されますが、set +m; (sleep 10 ; touch control-off) &
満たされません。
私はその答えが以下の文書の残りの部分にあると思いますset -m
。
-m Monitor mode. [...] Background pro‐
cesses run in a separate process group and a line con‐
taining their exit status is printed upon their comple‐
tion.
これは、開始されたバックグラウンドジョブがset +m
実際の「バックグラウンドプロセス」ではないことを意味します(「バックグラウンドプロセスは、端末のプロセスグループIDとは異なるプロセスグループIDを持つプロセスです」)。その操作を開始したシェルと同じプロセスグループIDを共有します。独自のプロセスグループIDを持つ代わりに。プロセスグループは適切なバックグラウンドプロセスと同じです。これは、いくつかのバックグラウンド操作の前にシェルがシャットダウンしたときに観察される動作を説明します。正しく理解した場合は、シャットダウンすると、シェルと同じプロセスグループ内のプロセスにシグナルが送信されます(したがって、開始されたバックグラウンドジョブが終了しますset +m
)。他のプロセスグループのプロセス(したがって、以下で開始された実際のバックグラウンドプロセスは考慮されませんset -m
)
したがって、あなたの場合、スクリプトはバックグラウンドstartup.sh
ジョブを開始できます。このスクリプトが非対話型(たとえば、リンクされた質問のようにSSHを介して)で実行されると、ジョブ制御は無効になり、「バックグラウンド」ジョブはリモートシェルのプロセスグループを共有するため、シェルが終了すると終了します。代わりに、そのシェルでジョブ制御を有効にすると、バックグラウンドジョブは独自のプロセスグループを取得し、親シェルが終了すると終了しません。