さくらインターネットのSSH接続でGNU screenを使う
現状の問題
さくらインターネットのレンタルサーバ(共用サーバ)で、SSH接続して作業していて、数十分放置していたときなど、回線がとぎれることがある。
いったん途切れた回線を再接続しても、さっきまで使っていたEmacsはプロセスとしては残ってるけど、ふたたび操作可能にはできない。
だから、プロセスkillしてEmacs再起動しなくてはならない。
これはあまり望ましくない。回線が途切れても、途切れる前の状態に戻したい。
screenの導入
インストール
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接続で、Emacs+ruby-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' というコマンドを使ってもいいね。