web-dev-qa-db-ja.com

`(sleep 123&)`はbashのジョブ制御からプロセスグループを削除しますか?

次のようにします

$ (sleep 123 &)
$ jobs
$ 

sleep 123のプロセスグループをbashのjobコントロールから削除しますか?上記の方法とdisownの違いは何ですか? sleep 123プロセスは、現在は消えているサブシェルが主導する同じプロセスグループにあり、対話型シェルと同じプロセスセッションにあるため、同じ制御端末を共有することに注意してください。

シェルのジョブ制御に含まれていないことは、sleep 123プロセスがbashプロセスから送信された信号(SIGHUPを含む)を受信しないことを説明していませんか?

ありがとう。

3
Tim

はい、いわば削除します。

インタラクティブなbashスクリプトから(...)サブシェルを実行すると、新しいプロセスグループ(ジョブ)が作成されます。これが端末のフォアグラウンドプロセスグループになります。サブシェルに&で終了するコマンドが含まれている場合(例:sleep 3600 &) )そのコマンドは、非常に同じフォアグラウンドプロセスグループで開始され、SIGINTSIGQUITは無視され、その入力は/dev/nullからリダイレクトされます)。標準へのリンクについては、 ここ を参照してください。

(...)サブシェルが終了すると、そのフォアグラウンドジョブはシェルのジョブテーブルから削除され、sleep 3600コマンドは引き続きシェルの制御外で実行されます。

これは、(sleep 3600 &)が非対話型スクリプトから実行され、ジョブ制御がなく、すべて(メインシェル、その(...)サブシェル)である場合とはまったく異なります。 、およびfoo &サブシェルの内部または外部の「バックグラウンド」コマンド((...))は、同じプロセスグループで実行されます。

2
mosvy