screen を起動すると、2つのプロセスが作られ、1つは daemon として動作し続け、仮想の制御端末を提供するので、screen の中で実行されるプログラムは止まらない、といった感じです。
ssh で繋いで screen を起動すると、動作中のプロセスは下記のようになります。
$ ps -lu july F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 29262 29260 0 75 0 - 2884 stext ? 00:00:00 sshd 0 S 500 29263 29262 0 75 0 - 1433 wait pts/3 00:00:00 bash 5 S 500 29334 29329 0 78 0 - 2884 stext ? 00:00:00 sshd 0 S 500 29335 29334 0 75 0 - 1433 wait pts/1 00:00:00 bash 0 S 500 29526 29335 0 75 0 - 2485 pause pts/1 00:00:00 screen 1 S 500 29527 29526 0 79 0 - 2522 stext ? 00:00:00 screen 0 S 500 29528 29527 0 85 0 - 1466 - pts/2 00:00:00 bash 0 R 500 29577 29263 0 77 0 - 1363 - pts/3 00:00:00 ps
PID が 29526 と 29527 の2つの screen があり、29527 の方は TTY(制御端末)が「?」になっています。つまり、29527 の screen は、制御端末が切り離されたプロセスになっています。この 29527 の screen の子プロセスとして、29528 の bash が動いています。この 29528 の bash の制御端末は pts/2 となっていますが、この「pts/2」が screen が作った仮想制御端末です。
なお、上記の例だと、pts/1 が最初に ssh で繋いだ時に sshd が作る仮想端末、pts/3 が後から ssh で繋いだ時に作られた仮想端末です。
ここで、デタッチすると、プロセスは下記のように代わります。
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 29262 29260 0 75 0 - 2884 stext ? 00:00:00 sshd 0 S 500 29263 29262 0 75 0 - 1433 wait pts/3 00:00:00 bash 5 S 500 29334 29329 0 75 0 - 2884 stext ? 00:00:00 sshd 0 S 500 29335 29334 0 78 0 - 1433 - pts/1 00:00:00 bash 1 S 500 29527 1 0 78 0 - 2522 stext ? 00:00:00 screen 0 S 500 29528 29527 0 85 0 - 1466 - pts/2 00:00:00 bash 0 R 500 29684 29263 0 77 0 - 1363 - pts/3 00:00:00 ps
29526 の screen は無くなり、その結果、29527 のスクリーンの親プロセス(PPID)が 1 になりました。これで、29527 の screen は daemon プロセスと同じ状態になりました。
ここで、screnn を起動した側の ssh の接続を切ります。
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 29262 29260 0 78 0 - 2884 stext ? 00:00:00 sshd 0 S 500 29263 29262 0 75 0 - 1433 wait pts/3 00:00:00 bash 1 S 500 29527 1 0 78 0 - 2522 stext ? 00:00:00 screen 0 S 500 29528 29527 0 85 0 - 1466 - pts/2 00:00:00 bash 0 R 500 29742 29263 0 77 0 - 1363 - pts/3 00:00:00 ps
29527 の screen が pts/2 を提供し続け、その pts/2 を制御端末とし、29527 の screen の子供として bash が動きつづけている事が分かると思います。
コメント(0件)