GNUScreenについて。SSHクライアントからサーバー上のプログラムを実行したとき、通信が切れるとプログラムも止まってしまいますが、GNUScreenを使用している場合はそのまま動き続けています。どういう仕組みなのでしょうか

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/15 02:00:03

回答1件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247

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 が動きつづけている事が分かると思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません