デタッチ(detatch)されたscreenセッションにコマンドを渡す方法

ぐぐったら見つけた。
http://www.mail-archive.com/hlds_linux@list.valvesoftware.com/msg49731.html

下記コマンドを実行すると、screenセッション上のフォアグラウンドプログラムでコマンドを実行できます。

screen -S セッション名 -p 0 -X eval ‘stuff srcds_command\015’
例)screen -S screen_test -p 0 -X eval ‘stuff map\040c2m1_highway\040versus\015’
srcdsコマンドのスペースは\040に置き換える必要あり。

普通?のscreenセッションにLinuxコマンドを渡す場合は
screen -S セッション名 -p 0 -X exec command
例)screen -S screen_test -p 0 -X exec uname -an

ちなみに”screen -S セッション名 -p 0 -X exec”でsrcdsのstatusコマンドを渡すと
Cannot exec ‘status’: No such file or directory
となる。下記ページの一番下のFeature(bugじゃない。)と同じ事なのかもしれない。

http://michael-prokop.at/screen/bugs.php3

個人用シェルスクリプトメモ(2010/09/27版)

[sourcecode language=”bash”]
#!/bin/sh -x
#start server(server01~04)
echo “starting l4d2-01”
screen -A -m -d -S l4d2-01 ./srcds_run -console -game left4dead2 -norestart +ip 0.0.0.0 +port 27015 +log on +servercfgfile server01.cfg
sleep 3
echo “starting l4d2-02”
screen -A -m -d -S l4d2-02 ./srcds_run -console -game left4dead2 -norestart +ip 0.0.0.0 +port 27016 +log on +servercfgfile server02.cfg
sleep 3
echo “starting l4d2-03”
screen -A -m -d -S l4d2-03 ./srcds_run -console -game left4dead2 -norestart +ip 0.0.0.0 +port 27017 +log on +servercfgfile server03.cfg
sleep 3
echo “starting l4d2-04”
screen -A -m -d -S l4d2-04 ./srcds_run -console -game left4dead2 -norestart +ip 0.0.0.0 +port 27018 +log on +servercfgfile server04.cfg
sleep 3
#get PID(server01~04)
pgrep -f “.*srcds_linux.*01\.cfg.*” > ./pid/pid_srcds_01
pgrep -f “.*srcds_linux.*02\.cfg.*” > ./pid/pid_srcds_02
pgrep -f “.*srcds_linux.*03\.cfg.*” > ./pid/pid_srcds_03
pgrep -f “.*srcds_linux.*04\.cfg.*” > ./pid/pid_srcds_04
server01=$(cat ./pid/pid_srcds_01)
server02=$(cat ./pid/pid_srcds_02)
server03=$(cat ./pid/pid_srcds_03)
server04=$(cat ./pid/pid_srcds_04)
#change nice value -4
sudo renice -4 $server01
sudo renice -4 $server02
sudo renice -4 $server03
sudo renice -4 $server04
#get pid(screen01~04)
pgrep -f “.*SCREEN.*01\.cfg.*” > ./pid/pid_screen_01
pgrep -f “.*SCREEN.*02\.cfg.*” > ./pid/pid_screen_02
pgrep -f “.*SCREEN.*03\.cfg.*” > ./pid/pid_screen_03
pgrep -f “.*SCREEN.*04\.cfg.*” > ./pid/pid_screen_04
screen01=$(cat ./pid/pid_screen_01)
screen02=$(cat ./pid/pid_screen_02)
screen03=$(cat ./pid/pid_screen_03)
screen04=$(cat ./pid/pid_screen_04)
#load Confogl
screen -S $screen01 -p 0 -X eval ‘stuff exec\040load_confogl_competitive.cfg\015’
screen -S $screen02 -p 0 -X eval ‘stuff exec\040load_confogl_competitive.cfg\015’
screen -S $screen03 -p 0 -X eval ‘stuff exec\040load_confogl_competitive.cfg\015’
screen -S $screen04 -p 0 -X eval ‘stuff exec\040load_confogl_competitive.cfg\015’

[/sourcecode]

-S screenセッションの選択(PID or セッション名)
-p ウィンドウ番号(screenセッション内でecho $WINDOW)
-X 渡すコマンド
eval コマンドを実行
stuff 入力バッファにいれる。

1 thought on “デタッチ(detatch)されたscreenセッションにコマンドを渡す方法

コメントを残す

メールアドレスが公開されることはありません。