みなさんGNU screenやtmuxを使ってますかー?愚問ですよね。
でもGNU screenやtmuxほど多機能なものはいらないんだ、デタッチ機能さえあればいいんだ、って方のためにdtachってのがあります。
dtach - A program that emulates the detach feature of screen
動かしてみる
dtach経由でtopを動かしてみます。socketは何でもいいですが、既存のファイル/ディレクトリ名とは被らないようにしましょう。ここでは仮にtop_dtachとしています。
$ dtach -c top_dtach top
別のターミナルなどを立ち上げてsocketが生成されていることを確認しましょう。
$ ls -l top_dtach srw------- 1 matsuu matsuu 0 Feb 23 23:12 top_dtach $ file top_dtach top_dtach: socket
このファイルを介してデタッチ/アタッチを行います。
デタッチしてみる
デフォルトのデタッチコマンドは、Ctrlキーを押しながら\です。デタッチすると次のようなメッセージが表示されます。lsでソケットファイルが消えてないことを確認しましょう。
[detached] $ ls top_dtach srw------- 1 matsuu matsuu 0 Feb 23 23:12 top_dtach
もしくは、dtachが動作しているターミナルを強制終了してみてもいいでしょう。強制終了してもソケットファイルちゃんと残っているはずです。
アタッチしてみる
アタッチは-aオプションでソケットファイルを指定すればokです。
$ dtach -a top_dtach
するとtopの実行を再開できます。
topを終了した場合、ソケットファイルは消えます。
新規作成の場合は-c、アタッチの場合は-aでソケットファイルを指定する必要がありますが、アタッチなのか新規作成かを意識しないで使える-Aオプションもあります。
$ dtach -A top_dtach top
デタッチのコマンドを変更する方法
デフォルトのデタッチ用キーはCtrlキーを押しながら\ですが、これは-eオプションで変更が可能です。また、-Eオプションならデタッチキー自体をOFFにできます。
なるほど。でもそれってGNU screenやtmuxがあればいらないんじゃ・・・
例えば、screenやtmuxを動かしている環境から別のサーバにSSHなどでアクセスする際にデタッチ機能を利用したい場合、screen in screen, tmux in tmuxとなって色々とツライですよね。
だったらscreen/tmuxからリモートサーバに接続する際にはdtachをリモートサーバにインストールして使えばいいんじゃない?という話ですはい。
アタッチした際に前の画面が残ってないので使えない?(対策パッチあります)
現在の最新版0.8では、デタッチ/アタッチすると前の画面が残りません。例えばdtachの中で、
tail -f /var/log/hogelog
としていたものをデタッチ、アタッチすると古いログが全部消えてて残念なことになります。
が、大丈夫。githubにscrollback bufferを溜めておく対策パッチがあるのでこれを使いましょう。
https://github.com/bogner/dtach/commit/21ede5c752f1cadcb51d6809964e04387d012133
まとめ
- dtachはデタッチ機能に特化したツールだよ
- screenやtmuxのように画面分割、スクロール、コピーペースト、ログ機能などは一切ないよ
- スクロールバッファが残らない問題は対策パッチがあるよ
- screen/tmux環境から別サーバにssh等でアクセスする際に、
screen/tmux環境リモートサーバにdtachを入れると良いよ
ちなみにscreenやtmuxと同じようなものでdvtmってのもあるよ
dvtm | dynamic virtual terminal manager
これはデタッチ機能がないのでdtach+dvtmはいい組み合わせです。