Slide 1

Slide 1 text

シェルのジョブ Feb. 23rd, 2025 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

シェルのジョブ ● シェル上での1つのコマンド、またはパイプで繋がれた一連のプロセス ● 2種類ある ○ フォアグラウンドジョブ : 実行時に末尾に”&”を付けない(e.g. ps ajx | less) ■ 端末に直接アクセスできる ■ セッションの中で常に 1つ ○ バックグラウンドジョブ : 実行時に末尾に”&”を付ける(e.g. go build &) ■ バックグラウンド(裏側)で実行 ■ 端末に直接アクセスできない ● アクセスするとフォアグラウンドプロセスになるまで待たされる ■ セッションの中で複数存在できる 2

Slide 3

Slide 3 text

プロセスグループ 3 ● カーネルの機能 ● シェルのセッションはプロセスグループを使って実装している ○ フォアグラウンドジョブ => フォアグラウンドプロセスグループ ○ バックグラウンドジョブ => バックグラウンドプロセスグループ ● パイプラインの最初のプロセスをプロセスグループリーダーと呼ぶ ○ プロセスグループリーダーは端末の入出力を直接受け取る ● プロセスグループごとに固有のID、プロセスグループIDが対応する ○ プロセスグループIDはプロセスグループリーダーの PIDと等しい

Slide 4

Slide 4 text

セッションとジョブの関係 4 セッション プロセスグループ(ジョブ)1 (バックグラウンド) プロセスグループ(ジョブ)2 (フォアグラウンド) ps aux less 端末 go build bash 生成 生成&パイプでつなげる アクセス可 フォアグラウンド になるまで アクセスを待たさ れる

Slide 5

Slide 5 text

例 ● “go build”はバックグラウンドジョブ(プロセスグループ)として実行 ● “ps aux | less”はフォアグラウンドジョブ(プロセスグループ)として実行 5 $ go build & $ ps ajx | less PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND ... 19261 19262 19262 19262 pts/0 19653 Ss 1000 0:00 -bash ... 19262 19653 19653 19262 pts/0 19653 R+ 1000 0:00 ps ajx 19262 19654 19653 19262 pts/0 19653 S+ 1000 0:00 less ...

Slide 6

Slide 6 text

プロセスグループとシグナル ● シグナルはプロセスグループに送れる ○ プロセスグループ内の全プロセスにシグナルを送る ○ “kill”コマンドの場合、例えば ”kill -100”を実行するとプロセスグループ (IDは100)にシグナルを送る ● 疑似端末上で”C-c”を押すとフォアグラウンドプロセスグループにSIGINTシグナル を送る ○ バックグラウンドプロセスグループには送らないのでバックグラウンドプロセスは残る 6

Slide 7

Slide 7 text

まとめ ● シェルのセッションにはジョブという概念がある ● ジョブはカーネルのプロセスグループという機能によって実現している ○ フォアグラウンドジョブ => フォアグラウンドプロセスグループ ■ 端末に直接アクセスできる ○ バックグラウンドジョブ => バックグラウンドプロセスグループ ■ 端末にアクセスすると待たされる ● プロセスグループにシグナルを送信すると、所属する全プロセスにシグナルを送信 する 7