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

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

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

しかし、これには困難があります。 を使用して接続しなくても、画面を正しく作成できます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 つのコマンドで実行する方法、または作成後、コマンドの実行前に画面に接続せずに実行する方法はありますか?

前もって感謝します。

**更新 - 実行する必要のあるコマンドをシェル スクリプト内に配置するという提案を試したところ、画面を正常に作成し、画面内からコマンドを実行することができましたが、スクリプトの実行が停止すると画面も閉じるという動作が発生しています。スクリプトはログ スクリプトであり、システム管理者の許可がある場合、または開発しようとしているスクリプトによってのみ停止する必要があるため、これは問題にならないはずですが、スクリプトが停止しても画面が消えないように画面を設定することが望ましいでしょう。この動作を実現することは可能ですか? **

答え1

いくつかの問題に遭遇する可能性があると思います。

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

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

答え2

分離画面を起動する

screen -dmS <screen name>

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

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

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

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

答え3

これは私にとってはうまくいきましたが、うまく-cいきませんでした

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

答え4

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

 # 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

(これはcatgnu-screen 内で実行されたホスト名を示しています)

関連情報