Slide 1

Slide 1 text

シェルのセッション Feb. 8th, 2025 Satoru Takeuchi X: satoru_takeuchi 1

Slide 2

Slide 2 text

シェルのセッション ● ログインしてシェルが立ち上がってからログアウトしてシェルが終了するまでの期間 ● ログインセッションとも呼ばれる ● カーネルのセッション機能を使っている 2

Slide 3

Slide 3 text

カーネルのセッション機能 ● 各セッションにはセッションID(SID)が割り当てられる ● セッションを開始したプロセス(bashなど)がセッションリーダーとなる ● 端末(デバイス名はttyXやptyX)に結びついている ○ 📝 その33「端末デバイス」 ○ ほとんどの場合はgtermのような疑似端末に結びついている ○ よくわからなければ「文字だらけの白黒のウィンドウ」くらいの感覚でよいです ● ログインセッションでないセッションもある ○ 📝 別動画で紹介予定 3

Slide 4

Slide 4 text

セッションIDの表示 ● bashからps ajxを実行 4 $ ps ajx PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND ... 19261 19262 19262 19262 pts/0 19647 Ss 1000 0:00 -bash ... 19262 19647 19647 19262 pts/0 19647 R+ 1000 0:00 ps ajx ...

Slide 5

Slide 5 text

システムに複数のログインセッションが存在する場合 5 Aさんのセッション: go build & vim Bさんのセッション1: ps aux | less Bさんのセッション2: sleep 10 bash go build zsh ps aux less vim zsh sleep 10 セッション 端末 pty/0 pty/1 pty/2

Slide 6

Slide 6 text

セッションに紐付く端末が末の接続が切れると… ● カーネルがセッションリーダー(bashなど)にSIGHUPを送る ● bashはSIGHUPのハンドラで同じセッションに属する全ジョブにSIGHUPを送って から終了 ○ ジョブはパイプで繋がれた一連のプロセス ■ 📝 別動画で解説予定 ○ ジョブにSIGHUPを送る ~= プロセスにSIGHUPを送る ○ プロセスはSIGHUPを受信するとデフォルトで終了する ● 疑似端末ウィンドウを閉じると端末から実行したプロセスが全部終了するのはこの 仕組みによるもの 6

Slide 7

Slide 7 text

プロセスを終了させたくなければ… ● プログラムでの対処 ○ SIGHUPを無視するコードを書く ○ SIGHUPのシグナルハンドラを設定して、このシグナルを受信しても終了しないようにする ● 便利コマンド ○ nohupコマンド ■ SIGHUPを無視する設定にしたうえでプログラムを起動する ○ bashのdisown組み込みコマンド ■ ジョブ(プロセスのかたまり)をbashの管理下から外す ■ bashがSIGHUPを受け取ってもdisownしたジョブにはSIGHUPを送らない 7

Slide 8

Slide 8 text

まとめ ● ログインしてからシェルが立ち上がってログアウトしてシェルが終了するまでに保持 される期間をセッションと呼ぶ ● カーネルのセッション機能に結びついている ● セッションは端末に結びついている ○ 端末の接続が切れると通常はセッションに紐づくプロセスはすべて終了する ○ nohupコマンドやbashのdisown組み込みコマンドを使うと終了を避けられる 8