私は* nixでかなり新しいです。特定のコマンドシーケンスを(独自の引数で)すぐに実行する画面を作成する方法はありますか? 2時間のグーグル検索では何も得られません。おそらく、質問を明確に述べることができないためです。
私は次のようなものを願っています
screen -dmS new_screen exec "cd /dir && Java -version"
画面v4.00.03およびCentOS 5.5(カーネルバージョン2.6.18-194.26.1.el5.028stab079.2)を使用しています
問題は、「exec」画面コマンドを使用してもシェルが起動しないことです。 「cd」はシェルに組み込まれているため、シェルが必要です。また、画面が終了しないように実行し続けるシェルが必要です。
-Xオプションを使用してscreenを実行し、実行中のscreenセッションにコマンドを送信し、「stuff」コマンドを使用してキーストロークを現在のウィンドウに送信できます。これを試して:
screen -dmS new_screen sh
screen -S new_screen -X stuff "cd /dir
"
screen -S new_screen -X stuff "Java -version
"
はい。コマンドを実行するには、次の行に引用符を付ける必要があります。
名前を付けて分離モードで画面を作成します。
screen -S "mylittlescreen" -d -m
次に、画面上で実行されるコマンドを送信します。
screen -r "mylittlescreen" -X stuff $'ls\n'
$
コマンドの前に、シェルが引用符内の\ nを解析するようにします。コマンドを実行するには改行が必要です(Enterキーを押したときなど)。
これは、この画面バージョンで私のために働いています:
$ screen -v
画面バージョン4.00.03jw4(FAU)2006年5月2日
見てください man screen
コマンドの詳細。
screen -dmS screen_name bash -c 'sleep 100'
これにより、screen_name
という名前の新しい画面が作成されます。また、画面内で100秒間スリープします。
sleep 100
の代わりに実行するとすぐに終了するコマンドを入力すると、画面も終了することに注意してください。 つまり、作成したばかりの画面を見ることができなくなります
Bashスクリプト内で定義され、画面内で使用可能ないくつかの変数を使用して、bashスクリプト内からリモート画面を起動したかったのです。だから私のために働いたのは
#!/bin/bash
SOMEVAR1="test2"
# quit existing if there is one running already, be careful
screen -D -RR test1 -X quit || true
screen -dmS test1
screen -r test1 -p 0 -X stuff $"echo ${SOMEVAR1} ^M"
リターン文字^ Mの場合、vimを使用して入力する必要があります
i CTRL-V ENTER ESCAPE
これが使えると思う
function exec_in_screen() {
name=$1
command=$2
screen -dmS $name sh; screen -S $name -X stuff "$command\n";
}
その後...
exec_in_screen "test" "ls"
別のアプローチ
最初の行cdでディレクトリに移動します。 2行目は、new_screenという名前の新しいスクリーンセッションをbashで開始します。 Java -version
を実行する3行目
cd /dir
screen -dmS new_screen bash
screen -S new_screen -p 0 -X exec Java -version