概要
普段からGNU SCREENを利用しており、いつも最初にscreenを立ち上げた後に定型的な処理を行う人にとって良い情報かもしれません
ナウなヤングはtmuxを使ってると思うのでおじさん向けの情報となります
僕の場合はいつも適当に5〜6個くらいwindowを作り、0番に glances
1番にルーターへのssh接続 2番に nethogs
を起動しています
スクリプト
screen初期起動用のスクリプトを用意します
#!/bin/bash
# screenの初期起動用スクリプト
session_name=init-session
# screenが既に立ち上がっていればアタッチする
screen -ls $session_name
if [ $? -eq 0 ]; then
screen -r $session_name
exit 0
fi
# ホームディレクトリをカレントディレクトリとしたい
cd ~
screen -dmS $session_name
cd - > /dev/null
# 追加で適当にwindowを6個作る
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
sleep 1
screen -S $session_name -p 0 -X stuff "glances$(printf \\r)"
screen -S $session_name -p 1 -X stuff "ssh router$(printf \\r)"
screen -S $session_name -p 2 -X stuff "sudo nethogs$(printf \\r)"
screen -r $session_name
ポイント
- セッション名を指定しておくことで
screen -ls セッション名
でそのセッション名のscreenが立ち上がってるかを確認できる - セッション名を指定しておくことで
screen -r セッション名
でそのセッション名のscreenをアタッチできる -
-X screen
オプションで新規windowを作成できる -
-X stuff "文字列"
オプションでwindowに対して文字列を流し込める -
-p windowの番号
オプションで特定のWindowに対して操作ができる
ざっくりこんな感じのようです
上記を踏まえて
先述のスクリプトをざっくり解説してみます
まずはセッション名を init-session
としておきます
スクリプト起動時にセッションが存在しているか確認し、存在していればアタッチするようにしています
ここはお好みで何も起きないようにするなども考えられそうです
#!/bin/bash
# screenの初期起動用スクリプト
session_name=init-session
# screenが既に立ち上がっていればアタッチする
screen -ls $session_name
if [ $? -eq 0 ]; then
screen -r $session_name
exit 0
fi
次にscreenを立ち上げる前にホームディレクトリに移動します
ここもお好みで特定のディレクトリに移動するケースがあっても良さそうです
/path/to/任意
でscreenを立ち上げると新規にwindowを作った際のカレントディレクトリが /path/to/任意
になります
ここでセッション名付きでscreenを立ち上げます
-d
-m
オプションを利用してデタッチ状態でscreenを立ち上げます
-S
オプションを利用してセッション名を指定します
その後、元のディレクトリに戻っておきます
(これ要らん気もする)
# ホームディレクトリをカレントディレクトリとしたい
cd ~
screen -dmS $session_name
cd - > /dev/null
続いて追加でwindowを作ります
今回のケースでは上記で0番目が出来ているので、最低でも追加で2つ用意しておきます
僕はいつも適当にいくつかwindowを作るのでそれにならって6つ追加するようにしておきました
# 追加で適当にwindowを6個作る
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
screen -S $session_name -X screen
この後に各windowに対してコマンドを実行するのですが、続いて実行させたところzshの立ち上がりが遅いせいかnethogsだけ起動してるみたいなケースになってしまったのでsleepを挟みました
僕の環境ではこれで上手く行きましたが、もっとsleepした方が良いケースやそもそもsleepが要らないケースもあるかもしれません
-X stuff "$command$(printf \\r)"
という形で任意のコマンドを流し込めますので色々やってみてください
sleep 1
screen -S $session_name -p 0 -X stuff "glances$(printf \\r)"
screen -S $session_name -p 1 -X stuff "ssh router$(printf \\r)"
screen -S $session_name -p 2 -X stuff "sudo nethogs$(printf \\r)"
もろもろ準備が出来たので最後にアタッチしてやります
screen -r $session_name
それでは良いscreenライフを