以下は、対話型シェルのプロセスグループがシェルの操作ではない2つの状況です。
$ sleep 100 &
[1] 16081
$ jobs
[1]+ Running sleep 100 &
$ disown %1
$ jobs
$
そして
$ ( sleep 200 & )
$ jobs
$
プロセスグループがもはや仕事にならないように、各ケースをどのように実装できますか?インタラクティブbashでプロセスがシェルの作業になるための必要条件は何ですか?
シェルは擬似端末スレーブで実行されるセッションリーダーです。シェルが終了すると、上記の 2 つの休止プロセスはシェルのタスクリストにないため、影響を受けず、したがって SIGHUP を受信しません。それから
両方の休止プロセスは依然として、そのセッションの制御端末として擬似端末スレーブ装置を有しているか?
正常にシャットダウンするか、
kill
シグナルを送信してスリープするプロセスをすべてシャットダウンすることに加えて、シャットダウンするために実行できる他の方法は何ですか?
これら2つのシナリオが実際のデーモンの効果とどのように異なるかを知りたいです。
答え1
どちらの場合も、プロセスグループはシェルで作業を開始します。を呼び出すと、disown %1
シェルはタスクリストからそのエントリを削除します。これがまさにすべてですdisown
。( sleep 200 & )
このプロセスsleep
は、括弧で作成されたサブシェルの操作です。を実行すると、これを確認できます( sleep 200 & jobs )
。シェルが終了すると、ジョブはもはやシェルのジョブではなく、他のすべてのジョブと同様に、サブシェルのジョブは独自のジョブであり、親シェルではこれを見ることができません。
プロセスは同じセッションで維持され、依然として同じ制御端末を有する。これはジョブ制御には関係ありません。
他のプロセスと同様に、シャットダウンまたは信号を受信してシャットダウンすることができます。彼らはフォアグラウンドプロセスグループのメンバーではないので(シェルはそれらをフォアグラウンドに戻さないので、そうではありません)、ターミナルが消えてもカーネル生成SIGHUPを受け取りません。
プロセスグループは、シェルのジョブから始まり、シェルのジョブとして残っている場合のシェルのジョブです。どのコマンドが別々のアクションになるかについての詳細は、シェルによって異なり、この回答の範囲外です。つまり、シェルでジョブ制御が有効になっている場合(シェルが対話型の場合はデフォルト)、各複合コマンドは独自のジョブです。特に:
- パイプラインは単一の操作です。
- コマンドまたはプロセスの交換は別のタスクではなく、元のプロセスグループ内で実行されます。
- バックグラウンドで実行されるすべてのタスク(
&
Ctrl + Zで始まるかバックグラウンドで実行するか)は別々のタスクです。
disown
プロセスグループのリーダーが終了したり、シェルが終了したり、シェルがそれを削除(使用)したりすると、プロセスグループはもう機能しません。