さくらインターネットのSSH接続でGNU screenを使う

現状の問題

さくらインターネットのレンタルサーバ(共用サーバ)で、SSH接続して作業していて、数十分放置していたときなど、回線がとぎれることがある。

いったん途切れた回線を再接続しても、さっきまで使っていたEmacsはプロセスとしては残ってるけど、ふたたび操作可能にはできない。
だから、プロセスkillしてEmacs再起動しなくてはならない。

これはあまり望ましくない。回線が途切れても、途切れる前の状態に戻したい。

解決手段

GNU screenを使えば解決する。
screenにはレジュームという機能があり、回線が一度とぎれたあとも、再接続してレジュームすれば回線途絶前の状態にすぐ戻れる。

screenの導入

インストール

追記:2011年1月 インストール方法が少し変わっていました。

itouhiro@www573 ~> uname -a

でOSを確認すると FreeBSD7.1のままですが、現在のFreeBSDはバージョン8.xが本流なので、packagesの場所が少し異なります。

pkg_add -P ~/local ftp://ftp.sakura.ad.jp/pub/FreeBSD/ports/i386/packages-7.3-release/sysutils/screen-4.0.3_7.tbz

これでインストールOKでした。


2009年11月現在、さくらインターネットのサーバOSはFreeBSD7.1である。 FreeBSDにはpackagesというコンパイル済みのバイナリがあるので、それを入れるのが手軽である。

itouhiro@www573 ~> pkg_add -P ~/local ftp://ftp.sakura.ad.jp/pub/FreeBSD/ports/packages/sysutils/screen-4.0.3_6.tbz

これで終わり。 ~/local/binにはPATHを通しておくこと。

設定ファイル作成

screenの操作キーはCtrl-Tとする。Emacsで重要ではないキーだからである。

~/.screenrc には、こう書いている。

defencoding utf8
escape ^t^t
vbell off

UTF-8環境で GNU Screen の日本語表示が崩れる件」 http://d.hatena.ne.jp/wocota/20090824/1251129515
を参考にしたけど、cjkwidth onは効果がないようだ。「unknown command: 'cjkwidth'」と表示される。

けれど、Emacs22で通常通り日本語の読み書きできる。

なお SSHクライアントはputtyを使い、「さくらインターネットSSH接続で、Emacsruby-modeを使う」 http://d.hatena.ne.jp/itouhiro/20091122 に書いた設定で使っている。

使い方

itouhiro@www573 ~> screen -U

で起動する。'-U'というのはUTF-8を使うという指定だ。 .scrrenrc文字コードをutf8と指定してあるが、このオプションも指定する必要がある(ないと文字化けした)。
この中で作業すれば、回線途絶後も screen -rU で回復できる。



puttyの設定で横120文字に設定しても、screenを起動したとたんに横80文字になってしまう。
→ termcapinfoを設定する必要がある。
http://paranoids.sakura.ne.jp/kaworu/2008-03-06-1.php


http://risky-safety.org/~zinnia/screen/contribute1/text.html
を参考にして、

screen -U emacs -nw

としてscreenを起動すると、0番目のウィンドウがemacsになる。
screenのウィンドウは普通shell(bashとか)が起動するのだが、このコマンドだとshellがemacsになる。 → Ctrl+Zで最小化してshellに戻れない。
シェルを使うために、Ctrl+T c で新しいscreenウィンドウを作る必要がある。(Emacs内でshellやeshellも使えるけど、私が使うといつもcatやlessコマンドを入力しておかしなことになるので、shellは別に起動することにしている)
Ctrl+T 0, Ctrl+T 1 でウィンドウを切り替え。



[合いの手担当] なんで、こんなことする必要があるの?


[しゃべり担当] いや、ローカルにファイル置いておくと、ほかのPCと共有するのがメンドイから。だからGoogleドキュメントでブラウザから入力とかしてるけど、Emacsで入力できればそのほうがショートカットキーが使いやすいなど、やりやすいのさ。


それに自分のレンタルスペースで編集・保存するから、Googleから情報漏洩する不安や、Googleからは私の書いた文章覗き放題という事態からも無縁でいられる。


でもSSH接続だとときどき回線途絶でそれまで入力していた文章が未保存のままなくなるから、回線途絶しても回復できるソフトがあるなら使ってみようということ。


[合いの手担当] でも、さくらインターネットの共用レンタルサーバで、24時間プロセス立ち上げっぱなしでいいのか?


[しゃべり担当] ダメだろうな。以下はCGIに関する注意書きだけど、つまり常駐プロセスはまずい。

http://support.sakura.ad.jp/support/manual/rs/tech_cgi.shtml

daemonとしてサーバに常駐するプログラムの実行
発見した場合、予告無くプロセスを強制終了する場合があります。

だから、エディタを使わないときはscreenプロセスを停止するようにしてる。
で次に使うとき、screenプロセスを立ち上げなおす、と。


こんなエイリアス設定を ~/.bashrcに書いているぞ。

alias sc='screen -U'
alias se='screen -U emacs -nw'
alias sr='screen -rU'
alias sx='screen -xU'

'se' でscreenを立ち上げて、同時にEmacsも立ち上がる。
shell (bash)を使うときは、Ctrl+T c で新しいscreen画面を作る。
screenを停止するときは、EmacsならC-xC-c、bashはCtrl+Dで、screen内プロセスをすべて終了させる。
'sr' でscreenをリジュームできる。


けっこう日本語主体の文章も入力できるなー。Ctrl+BackSpaceの再変換もできる。isearchで普通に日本語文字列をインクリメンタル検索できる。しかもEmacs22なので落ちずに安定している。
ローカルにEmacsをインストールしなくても、Emacs使えて便利だ。


[合いの手担当] ねえ。 'screen -rU' ってやると、以下の表示になって、再接続できないことがあるんだけど。

itouhiro@www573 ~> screen -rU
There is a screen on:
        28127.ttyp1.www573      (Attached)
There is no screen to be resumed.


[しゃべり担当] そういうときは、screen -d 28127 って入力していったんデタッチしてから、改めて、 'screen -rU' ってやるとよいぞ。
普通、回線が切断されたら自動でデタッチされるんだけど、されないこともあるみたいだな。

または、'-r'の代わりに'-x'を使う、具体的には 'screen -xU' というコマンドを使ってもいいね。