rcmdnk's blog
Last update

Socket

GNU screenでセッション情報が保存してあるソケットディレクトリは 通常/tmpやそういったところにありますが、 WindowsやMacで使ってる時にふと再起動した時にも 消えないで残っててくれないかな、と思ってやってみた、と。

Sponsored Links

SCREENDIR

/tmpディレクトリとかは再起動時に消されてしまうので 残ってくれません。

このディレクトリは、環境変数で SCREENDIRという値で変えられます。

このディレクトリはパーミッションが700(自分だけが読み書きできる) 様になっていないといけないようなので、 .bashrc

.bashrc
1
2
3
4
5
6
#export SCREENDIR=$HOME/.screen_$(hostname -s)
export SCREENDIR=$HOME/.screen_$(hostname|cut -d. -f1)
if [ ! -d $SCREENDIR ];then
  mkdir -p $SCREENDIR
fi
chmod 700 $SCREENDIR

こんな感じで書いてみました。

追記: 2014/05/14

Cyginのhotname.exe-sをサポートしてなかったので cutを使う様に更新。

追記ここまで

ディレクトリ名にホスト名を付けているのは、 複数の端末でホームディレクトリを共有してる場合などに 競合を避けるためです 1

これできちんと$HOME/.screen_$(hostname|cut -d. -f1)へ入ってることを確認 2

$ echo $SCREENDIR
/Users/user/.screen_myhost
$ ls $SCREENDIR
00000.ttys000.myhost

Macで再起動してみる

で、適当なセッションを作ってデタッチしてMac自体を再起動してみました。

$ screen -ls 
No Sockets found in /Users/user/.screen_myhost

…と。ディレクトリを直接覗いてみると、確かに上のものは消えて何もありません。

どのタイミングで誰が消したかわからにですが、消えていました。

ただ、よく考えてみると、screenのセッション自体の情報を残しておいても、 そこで動いてるプロセスは皆死ぬわけで、 仮にセッション情報が残っていても立ち上がるわけ無いな、と、当たり前ですが。

ということで馬鹿なことをしましたが、SCREENDIRについて少し学べたな、と。

誰がどのタイミングで設定ファイルを消してるのかが少し気になりますが、 結局良くわかりませんでした。

SCREENDIRが特に有用なとき

例えば、/tmpを定期的に消されてしまうような環境では 下手すると勝手にセッション情報が消されてしまうので 自分の管理できるところにおいておくと安全かも。

ので、上みたいな設定を.bashrcに書いておいても 損はしないだろうと (これだけの作業でそこまで.bashrcの読み込みが遅くなることも無いでしょうし)。

Sponsored Links
  1. 試しに、$HOME/.screen/という共通のディレクトリにして、 ある端末でscreenのセッションを作って、 他の端末でscreen -lsしてみたら 通常の死んだセッションの様に DEAD ???とされてscreen -wipeしてください、と出されました。

    それでももとの端末で見てみるときちんとアタッチできました。

  2. なんか上手くいかない場合はディレクトリのパーミッションがおかしい場合があるので チェックしてください。 特に手でmkdirしてchmod忘れてる場合とか。

Sponsored Links

« vim-surroundで文字列を複数文字('**'など)で囲む GNU screen 最新版について »