ttyとプロセス管理

ttyやら端末切断時のプロセス管理について曖昧だったので、調べてみた。

ttyとは...

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。

http://ja.wikipedia.org/wiki/Tty

端末デバイスには仮想コンソール(virtual console)と擬似端末(pseudo terminal)があり、前者は物理端末でPCに直接繋がっているものを、後者はsshなど遠隔でログインした端末を示す。

Macでtty
$ tty
/dev/ttys008
sshしたLinuxでtty
$ tty
/dev/pts/6

たとえば echo test > /dev/pts/6 とすると、pts/6という仮想端末に test という文字が表示されることから、端末デバイスという意味がよくわかる。

ターミナルクローズ

SSH接続時にネットワークが切れる or ターミナルソフト(TeraTermやiTermなど)を終了すると、リモートで実行しているプロセスも終了するがこれはどういう仕組みなのか。

i=0;
for i in {0..32};
do
    trap "echo $i >> log.txt" $i;
done
sleep 100

として、このshellスクリプトを実行中にブチっと切断すると

1
18
0

という結果を得られる。

  • 0: プロセス終了時に自身に送られるEXITシグナル。
  • 1: SIGHUP(制御端末(controlling terminal)のハングアップ検出または制御しているプロセスの死)
  • 18: SIGCONT(一時停止 (stop) からの再開)

さらに、スクリプトをシグナルを無視するように変更。

trap '' 1;
sleep 100;

これでブチっと切断すると、

$ ps aux | grep trap
user     22849  0.0  0.0 110292  1200 pts/3    S+   16:19   0:00 bash trap.sh

から

$ ps aux | grep trap
user     22849  0.0  0.0 110292  1200 ?        S    16:19   0:00 bash trap.sh

となり、属する端末はなくなったが、実行され続けることが確認できた。 つまり、端末クローズ時にSIGHUPがプロセスに送られることで、実行中のJOBが停止されることがわかる。

screenは?

man screen screen は呼び出されるとウィンドウを 1 つ生成し、その中でシェル (または指定されたコマンド) を実行する。そしてユーザからは 見えなくなり、ユーザは通常通りにプログラムを実行できるようになる。その後はいつでも、新しい (全画面) ウィンドウの生成およ びそこでの他のプログラムの実行 (別のシェルも含む)、いまあるウィンドウの削除、ウィンドウリストの表示、ログ出力の#㈿### ・ 無 効化、ウィンドウ間でのテキストのコピー&ペースト、スクロールバック履歴の閲覧、望む通りのウィンドウ切り替え、等ができる 。各々のウィンドウは、それぞれ自分のプログラムを他からは完全に独立したかたちで動作させる。ウィンドウが現在見えなくても、 あるいは screen セッション全体がユーザの端末から切り離された場合でも、各プログラムは動作を続ける。

screenはセッションが切り離されても、各プログラムは動作を続けるようになっている、とのこと。

参考サイト

http://stackoverflow.com/questions/5546223/signals-received-by-bash-when-terminal-is-closed http://d.hatena.ne.jp/language_and_engineering/20110617/p1 http://shellscript.sunone.me/signal_and_trap.html http://www.glamenv-septzen.net/view/854#id3d4712