次のようにします
$ (sleep 123 &)
$ jobs
$
sleep 123
のプロセスグループをbashのjobコントロールから削除しますか?上記の方法とdisown
の違いは何ですか? sleep 123
プロセスは、現在は消えているサブシェルが主導する同じプロセスグループにあり、対話型シェルと同じプロセスセッションにあるため、同じ制御端末を共有することに注意してください。
シェルのジョブ制御に含まれていないことは、sleep 123
プロセスがbashプロセスから送信された信号(SIGHUPを含む)を受信しないことを説明していませんか?
ありがとう。
はい、いわば削除します。
インタラクティブなbashスクリプトから(...)
サブシェルを実行すると、新しいプロセスグループ(ジョブ)が作成されます。これが端末のフォアグラウンドプロセスグループになります。サブシェルに&
で終了するコマンドが含まれている場合(例:sleep 3600 &
) )そのコマンドは、非常に同じフォアグラウンドプロセスグループで開始され、SIGINT
とSIGQUIT
は無視され、その入力は/dev/null
からリダイレクトされます)。標準へのリンクについては、 ここ を参照してください。
(...)
サブシェルが終了すると、そのフォアグラウンドジョブはシェルのジョブテーブルから削除され、sleep 3600
コマンドは引き続きシェルの制御外で実行されます。
これは、(sleep 3600 &)
が非対話型スクリプトから実行され、ジョブ制御がなく、すべて(メインシェル、その(...)
サブシェル)である場合とはまったく異なります。 、およびfoo &
サブシェルの内部または外部の「バックグラウンド」コマンド((...)
)は、同じプロセスグループで実行されます。