ジョブ制御に関するbashリファレンスマニュアルを読んでいました。ここ(強調):
タスク制御ユーザーインターフェースの実装を容易にするために、オペレーティングシステムは現在の端末プロセスグループIDの概念を維持しています。このプロセスグループのメンバー(プロセスグループIDが現在の端末のプロセスグループIDと同じプロセス)は、SIGINTなどのキーボード生成信号を受信します。これらのプロセスフロントにいるそうです。バックグラウンドプロセスとは、プロセスグループIDが端末プロセスグループIDと異なるプロセスを意味する。
これを確認するためにいくつかの実験を実行しようとしていますが、期待した結果は得られません。
2つのターミナルウィンドウが実行されています(マイプライマリターミナルは変更がある場合はそこから実行されます)zsh
。bash
「実験」プロセスは次のとおりです。
- 端末Aで長いプロセスを実行するには、次を選択します。
ping -c 4000 google.com
- 端末Bで
pgid
端末Aで実行されているpingを確認したら、端末Aと同じでなければなりません。 - 端末Aから一時停止文字を送信すると、pingが一時停止して端末Aの操作に追加される必要があります。
- pingコマンドを確認したら、
pgid
端末Aとは異なる必要があります。
プロセス情報を確認するには、次のコマンドを使用します。
ps -e --forest -o pid -o ppid -o comm -o pgid | grep -E 'bas|zsh|pin'
実際の結果
pingを見つめる前に
287562 287551 | \_ zsh 287562
351151 287562 | | \_ bas 351151
354401 287551 | \_ zsh 354401
354486 354401 | \_ bas 354486
前景でpingを見た後:
287562 287551 | \_ zsh 287562
351151 287562 | | \_ bas 351151
354401 287551 | \_ zsh 354401
354486 354401 | \_ bas 354486
359864 354486 | pin 359864 # shouldn't this be the same as bash above ?
保留中の信号を送信した後:
287562 287551 | \_ zsh 287562
351151 287562 | | \_ bas 351151
354401 287551 | \_ zsh 354401
354486 354401 | \_ bas 354486
359864 354486 | pin 359864 # shouldn't this change after moving to the background?
私の質問は:なぜ親端末と同じ端末がping
ないのですか?前景から背景に移動してもpingが変わらないのはなぜですか?pgid
pgid