LoginSignup
1
0

GNU SCREENを使って自動で複数の(screenの)windowを作る

Posted at

概要

普段からGNU SCREENを利用しており、いつも最初にscreenを立ち上げた後に定型的な処理を行う人にとって良い情報かもしれません
ナウなヤングはtmuxを使ってると思うのでおじさん向けの情報となります

僕の場合はいつも適当に5〜6個くらいwindowを作り、0番に glances 1番にルーターへのssh接続 2番に nethogs を起動しています

スクリプト

screen初期起動用のスクリプトを用意します

init-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ライフを

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0