セッションとプロセスグループ

プロセスグループ

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/credentials.7.html より引用:

各プロセスはセッション ID とプロセスグループ ID を持つ。 これらの ID はどちらも pid_t 型で表現される。 プロセスは、それぞれ getsid(2), getpgrp(2) を使って自分のセッション ID、プロセスグループ ID を取得できる。

fork(2) で生成された子プロセスは親プロセスのセッション ID とプロセスグループ ID を継承する。プロセスのセッション ID とプロセスグループ ID は execve(2) の前後で不変である。

セッションとプロセスグループの概念は、シェルのジョブ制御を行うために 考案されたものである。 プロセスグループ (時には「ジョブ」と呼ばれることもある) は、 同じプロセスグループ ID を共有するプロセスの集まりである。 シェルは、一つのコマンドもしくはパイプラインの実行に使われるプロセス群に 対して一つのプロセスグループを生成する (例えば、コマンド "ls | wc" を実行するために生成される二つのプロセスは 同じプロセスグループに置かれる)。 所属するプロセスグループは setpgid(2) を使って設定できる。 自身のプロセス ID がプロセスグループ ID と同じプロセスは、 そのグループの「プロセスグループ・リーダー」である。

プロセスグループの例)
適当なコマンドを実行。パイプも使ってみる。


[user1@vm03 shtest]$ ./hoge.sh | less
別端末からプロセスの状況を確認。(ps の j オプションは BSD job control format.)

[user1@vm03 ~]$ ps j
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
4410 4411 4411 1966 pts/0 4978 S 501 0:00 -bash
4437 4438 4438 2029 pts/1 4982 S 501 0:00 -bash
4411 4978 4978 1966 pts/0 4978 S+ 501 0:00 /bin/sh ./hoge.sh
4411 4979 4978 1966 pts/0 4978 S+ 501 0:00 less
4978 4980 4978 1966 pts/0 4978 S+ 501 0:00 sleep 180
4438 4982 4982 2029 pts/1 4982 R+ 501 0:00 ps j
hoge.sh, less, sleep 180 はいずれもPGID=4978 で同一プロセスグループ。プロセスグループ・リーダーはPIDがPGIDと等しいhoge.sh。

セッション

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/credentials.7.html より引用:

セッションは、同じセッション ID を共有するプロセスの集まりである。 ある一つのプロセスグループの全メンバーは同じセッション ID を持つ (つまり、一つのプロセスグループのメンバーは全て同じセッションに所属し、 これにより、セッションとプロセスグループで二階層のプロセス階層が形成できる)。 新たなセッションの生成はプロセスが setsid(2) を呼び出すことで行う。 setsid(2) は、 setsid(2) を呼び出したプロセスの PID と同じ値のセッション ID を持つ 新たなセッションを生成する。 セッションの生成者は「セッション・リーダー」と呼ばれる。

あるセッションの全プロセスは一つの 制御端末 を共有する。 セッションリーダーが最初に端末をオープンした際に制御端末は設定される (open(2) の呼び出しで O_NOCTTY フラグが指定された場合を除く)。 一つの端末は、最大でも一つのセッションの制御端末にしかなれない。

一つのセッションのジョブの中で、フォアグラウンドジョブになれるのは最大でも一つで、そのセッションの他のジョブはバックグラウンドジョブである。 フォアグラウンドジョブだけが端末からの読み込みを行える。 バックグラウンドのプロセスが端末から読み込みを行おうとした場合、 フォアグラウンドジョブを停止させるシグナルである SIGTTIN が所属するプロセスグループに対して送信される。 端末に TOSTOP フラグがセットされていた場合 (termios(3) 参照)、 フォアグラウンドジョブだけが端末への書き込みを行える。 バックグラウンドのプロセスが端末への書き込みを行おうとした場合、 フォアグラウンドジョブを停止させるシグナルである SIGTTOU が生成される。 シグナルを生成する端末キー (例えば 中断キー、通常は control-C) が押された場合、 そのシグナルはフォアグラウンドジョブのプロセスに送信される。

セッションの例)
適当なコマンドを3回実行。3回目は&をつけず、フォアグラウンドで実行。


[user1@vm03 shtest]$ ./hoge.sh &
[1] 5012
[user1@vm03 shtest]$ ./hoge.sh &
[2] 5014
[user1@vm03 shtest]$ ./hoge.sh
別端末からプロセスの状況を確認

[user1@vm03 ~]$ ps ajx
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
:
1964 1966 1966 1966 pts/0 5019 Ss 0 0:00 -bash
:
1966 4410 4410 1966 pts/0 5019 S 0 0:00 su - user1
4410 4411 4411 1966 pts/0 5019 S 501 0:00 -bash
:
4411 5012 5012 1966 pts/0 5019 S 501 0:00 /bin/sh ./hoge.sh
5012 5013 5012 1966 pts/0 5019 S 501 0:00 sleep 180
4411 5014 5014 1966 pts/0 5019 S 501 0:00 /bin/sh ./hoge.sh
5014 5015 5014 1966 pts/0 5019 S 501 0:00 sleep 180
4411 5019 5019 1966 pts/0 5019 S+ 501 0:00 /bin/sh ./hoge.sh
5019 5020 5019 1966 pts/0 5019 S+ 501 0:00 sleep 180
:

  • SID=1966となっている各プロセスは、同一セッション。
  • SID=1966のセッションのセッション・リーダーはbash(PID:1966)。なお、上記psコマンドのSTATの"Ss"の小文字のsはセッション・リーダーであることを示す。
  • SID=1966のセッションのフォアグラウンドジョブはPGID=5019のジョブ。なお、上記psコマンドのSTATの"S+"の"+"はフォアグラウンドジョブであることを示す。
  • SID=1966のセッションの端末はpts/0である。pts/0は他のどのセッションの端末でもない。

端末 (terminal)

端末とはLinuxに対する標準入出力をLinuxと仲介するもの。
例えば、キーボードで入力した文字列を標準入力としてLinux/Unixに渡したり、標準出力をコンソール上に表示する。
psコマンドなどで表示されるttyやptsも端末のことを指している。
ptsは擬似端末と呼ばれ、telnetsshなどでログインするとこの端末に接続される。
ttyは仮想コンソールと呼ばれ、Linuxに直接接続している場合に使われる端末である。通常、Linuxの場合、最初の6つの仮想コンソール (/dev/tty1〜/dev/tty6) があり、Alt + ファンクションキー(F1など)で切り替えることができる。

ttyコマンド

以下のように、ttyコマンドで、現在利用している端末デバイスを表示することができる。


[user1@vm03 shtest]$ tty
/dev/pts/0

[参考]
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man7/credentials.7.html
http://equj65.net/tech/linuxprocessgroup/
http://ja.wikipedia.org/wiki/Tty