コマンド一発でGNU Screenを複数paneで開く(ローカル開発時に複数のサーバプロセスを起動しつつそれぞれ別paneで分割表示する)
GNU screenは、手元のmacOS High Sierra 10.13.3だと/usr/bin/screenにあって、versionは4.00.03
このバージョンはちょっと古くて水平方向分割には対応していないが、垂直方向分割ならできる
これを活かして、コマンド一発でscreenにより分割された画面を開きたい
用途としては、分割したそれぞれの画面で、webpack-dev-serverとローカルAPIサーバを別々に走らせて開発する、というようなこと
開発中のアプリで使用するマイクロサービスが複数あって、dockerでそれぞれローカルに立てて開発するようなケースでもうまくやれば利用できそう
単一画面にログだけ集約して流すのでなく、別々のscreen windowにそれぞれ流すことで、すべてのサーバプロセスが標準入力を握れる
Erlang/Elixirのサーバでは、起動するとconsole(Repl)にアタッチするようになっており、ちょっとしたデバッグ等に重宝するため、標準入力を握らせたい。他にもこういったケースはあるはず
かならず存在する環境でしか使用しないのであれば、tmuxを使ってもいい(多分同じようなことをやる方法があるはずだ)が、screenのほうが最初から入っている確率が高そう
ただし垂直分割もある程度のバージョンが必要(4.00+? 水平分割は4.01で入っているらしい)
やり方
まずプロジェクト用のscreenrcファイルを用意する。名前はなんでもいい。下記のような内容になる(termディレクティブはよくある256色表示を有効化するおまじない)
code:screenrc
term xterm-256color
screen webpack-dev-server
split
focus down
screen iex -S mix
そしてscreen -c screenrcで実行する。npm scriptsを使っているならこれをstartとかに割り当てる
https://gyazo.com/592b8a363c7720d1d9d1d007c9992ac6
起動したscreen sessionは通常のscreenのコマンドやショートカットで操作できるので、あとは普通にscreenを使うように扱えば良い
複数起動したサーバを一気に閉じたいのであればCtrl-A Ctrl-\でall killのプロンプトが出る
当然個別に再起動もできる。対象のpaneでCtrl-Cでコマンドを殺し、その後Ctrl-A Ctrl-Cで新規screen sessionがshellとともに立ち上がるので、コマンドを手動入力すれば良い
コマンドをリスタートするような機能があればいいけど。。。
これを発見するまでは、iex -S mix & webpack-dev-serverのようにバックグラウンド起動を使って単一画面に出していた
ログを見るだけならいいが、前述のとおり標準入力を握らせられないし、個別のサーバを再起動して設定を再読込させたい、といったケースで不便だった
標準入力を握りたいのがiexだけなのであれば、単にiexの順番を末尾にしてwebpack-dev-server & iex -S mixとしてもいいのだが、こうするとwebpack-dev-serverからのログ出力がiexからの出力と混ざったとき正しく表示されなくなってうざい
これはiexのバグか、もしくはLogger設定のミス?
Elmのようなコンパイル言語だと、エラー出力が読めないと困る
自分の環境では非常に便利