Gマイナー志向

とくに意味はありません

GNU screenのデタッチ機能に特化したdtachはGNU screenやtmuxと組み合わせて使っても便利です

みなさん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はいい組み合わせです。