Bashでは、プロセスグループは次の場合にのみ動作します...?

Bashでは、プロセスグループは次の場合にのみ動作します...?

以下は、対話型シェルのプロセスグループがシェルの操作ではない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プロセスグループのリーダーが終了したり、シェルが終了したり、シェルがそれを削除(使用)したりすると、プロセスグループはもう機能しません。

関連情報