web-dev-qa-db-ja.com

アタッチせずに画面を作成してコマンドを実行する

スクリーンセッションで実行されているスクリプトの開始と停止を含むメンテナンスルーチンの自動化に取り組んでいます。私のアプローチは、画面セッションを強制終了してから再起動し、画面に接続する必要なく画面を作成してコマンドを渡す機能を使用してスクリプト内からコマンドを実行することです。

しかし、私はこれで問題を抱えています。 screen -d -m -S screen_nameを使用して、画面をアタッチせずに正しく作成できます。ただし、以下に基づいてコマンドを実行した場合:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

echo -ne '\ 015'は単一引用符ではなくバッククォートでラップされています。私が使用するコマンドがディレクトリに移動し、そこにあるスクリプトを実行するときに、ユーザーがEnterキーを押すのをシミュレートします。このコマンドは機能しますが、作成後にスクリーンがアタッチされている場合のみです。画面を作成してその中でコマンドを実行するプロセスを自動化しようとしているので、スクリプト内でアタッチしたり切り離したりする必要はありません。画面内で実行して結果に応じて編集する必要があるコマンドを含むシェルスクリプトを作成することを提案します。

画面を作成して画面内でコマンドを1つのコマンドで実行する方法、または作成後、コマンドを実行する前に画面にアタッチする必要がない方法はありますか?

前もって感謝します。

**更新-シェルスクリプト内で実行する必要のあるコマンドを配置する提案を試みた結果、画面を正常に作成し、画面内からコマンドを実行できましたが、スクリプトが実行を停止したときの動作を取得しています画面も閉じます。スクリプトは、システム管理者の知識または開発しようとしているスクリプトによってのみ停止するロギングスクリプトであるため、これは問題にはなりませんが、画面が次のようになるように画面を設定することをお勧めします。スクリプトが停止しても消えません。この動作を達成することは可能ですか? **

29
coffeecoder

いくつかの問題が発生していると思います。

再アタッチする前にコマンドが終了すると、画面が消えます。あなたはこれを使ってこれをデモすることができます:

screen -d -m ls -l

ls -lコマンド、ただしscreen -list画面処理が終了したため、表示されません。

また、\ 015で何をしようとしているのかもわかりません。おそらく、質問を更新すると役立つでしょう。私がしようとしているのは、スクリーンセッションで複数のコマンドを実行することです。これは次のように単純でなければなりません。

screen -d -m bash -c "command1 ; command2 ; command3"

これらが頻繁に使用される場合は、おそらくこれらのコマンドのみを実行するシェルスクリプトを作成し、より単純なものを使用する必要があります。

screen -d -m /path/to/script.sh
18
Michael Graff

切り離された画面を開始する

screen -dmS <screen name>

以前に作成した切り離された画面でコマンドを実行する

screen -S <screen name> -X stuff '<CMD>\n'

はい、コマンドを送信するにはEnter記号を入力する必要があります。そうしないと、画面に文字列が追加されるだけです。

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html

11
Yogesh

以前にこの問題に遭遇したことがありますが、これはcygwin実装のバグでした。

私がしたことは、次のコマンドだけを持つ「.screenrc_detaching」を作成することでした

#detach
detach 

次に画面を開始します

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

次に、スクリーンセッションとそのアタッチとデタッチがあり、コマンドをそこに送り込むのに適しています。

カンタン! :P

2
PiersyP

-cが機能していなかったため、これは私のために仕事をしました

screen -d -m bash -c "command1; command2; command3"

2
Mazilu88

以前の回答をテストするコピーアンドペーストの方法は次のとおりです。

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

期待される結果は次のようになります。

No Sockets found in /var/run/screen/S-yourusernamehere.

(つまり、以前に作成されたスクリーンセッションはありません)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(これは、画面を作成して画面から切り離すのに費やされた時間です。ほとんど瞬時にです。)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(この出力は、使用可能な画面セッションを示しています。最後のコマンドで作成されます。)

sleep 20; cat /tmp/h

(このcatは、gnu-screen内で実行されたホスト名を示します)

1
screen -S test -d -m -- sh -c 'ls; exec $Shell'
0
Nadav B