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


28

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

しかし、私はこれに苦労しています。を使用して添付せずに画面を正しく作成できます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つのコマンドで画面内でコマンドを実行する方法はありますか、または作成後、コマンドの実行前に画面にアタッチする必要はありませんか?

前もって感謝します。

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


1
私はこの同じ問題に遭遇したと、この問題の時につまずく誰のためのsuperuser.comの解決策たsuperuser.com/questions/342463/...
ダン・ハーバート

画面を開いたままにするには、次のようなものを使用できます。screen bash -c 'echo "test"; / bin / bash '
-gwyn

1
自動終了の問題で.screenrcは、lineを含むspecial を使用しzombie krて、完成したウィンドウを開いたままにし、を押しkてwinodwを閉じるかr、ウィンドウでコマンドを再度実行できます。これはデフォルトの.screenrcにあります。
マーティンC. 14

回答:


17

いくつかの問題に直面していると思います。

再接続する前にコマンドが終了すると、画面は消えます。以下を使用して、これをデモできます。

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

画面をすぐにデタッチせずに同様の動作を得る方法はありますか?sshセッションを開始して、すぐに切り離したいとします。screen -d -m sshセッションが行われる前に、パスワードプロンプトでデタッチされます。
ブライトスター

これは私にはうまくいきません。hte "commandN"をいくつかの長時間実行プログラムで置き換えると、に何も表示されませんscreen -list。また、OPが実行しようとしているため、これは画面に名前を付けません。
セリン14

この方法を使用してpythonプログラムを実行しようとしていました。shスクリプトを作成して実行しようとしましたが、リストに画面が表示されませんでした。代わりに私が使用 screen -d -m python EventGenerator.py偉大な仕事をされ、
ダンCiborowski - MSFT

1
それはおそらくbash -c "commands"代わりになりますbash "commands"
-marcovtwout

そのとおり、-cが必要です。
Xdg

8

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

screen -dmS <screen name>

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

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

はい、コマンドを送信するにはエンターシンボルを入力する必要があります。入力しないと、画面に文字列が追加されます。

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


1
「もの」とは何ですか?
ナダブB

stuff実際には、別のコマンドをスクリーンセッションにコピーアンドペーストするコマンドです。stuff [string]現在のウィンドウの入力バッファーに文字列stringを詰めます。これは「貼り付け」コマンドに似ていますが、オーバーヘッドがはるかに少なくなります。パラメータを指定しないと、画面は文字列の入力を求めます。「stuff」コマンドで大きなバッファを貼り付けることはできません。キーバインドに最も役立ちます。「bindkey」も参照してください。[
terminallife.com/sending-commands-into-a-screen-session/

2

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

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

#detach
detach 

そして、画面を起動します

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

次に、スクリーンセッションを作成し、スクリーンセッションを既にアタッチおよびデタッチして、コマンドを送信します。

簡単!:P


2

これは私のために仕事をしましたが、機能して-cいませんでした

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


1

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

 # 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内で実行されたホスト名を示しています)


そして、そのようなテストの結果は何ですか?
Pierre.Vriens

あなたは正しい、例はありませんでした。追加します。
エンリケS.フィリエージュ

ずっといい!メルシ!+1
Pierre.Vriens

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.