動的 NAT タイムアウト対策。
きのう組んだシェルスクリプトと同じ事をする perl スクリプトを組んで動かしてみたら,ログアウト時の問題が解決した。
つまり,同じつもりでも,どこかが違うらしい。
ポイントは,STDIN,STDOUT,STDERR の close。
シェルスクリプトでも <&- >&- 2>&- というリダイレクトをしてやれば同じ意味だと思ったのだが。
#!/usr/local/bin/perl -w
# by ARAK
$ppid = getppid;
print "$0: stayed\n";
fork && exit;
close STDIN;
close STDOUT;
close STDERR;
$n = 0;
while (1)
{
sleep 60;
kill (0, $ppid) || exit;
if (++$n == 10)
{
open (TTY, "> /dev/tty") || exit;
print (TTY "\001") || exit;
close TTY;
$n = 0;
}
}
このスクリプトは,実行すると常駐し,10 分おきに tty にキャラクタコード 1 を出力する。
1 分おきに行う親プロセスの存在チェック,tty の open,出力のうちいずれかに失敗した時点で終了する。
2 バイト文字やコントロールコードの出力の途中でキャラクタコード 1 が混じってしまった場合にどうなるかはわからない。
使い方は,.login (またはこれに相当するスクリプト) の中で $REMOTEHOST を見て,動的 NAT な環境からのログインだと判った場合にだけ起動してやれば OK。
ログアウトしたら通常 1 分以内に勝手に消滅する。