web-dev-qa-db-ja.com

bashスクリプトを使用して、画面でプロセスをアタッチ、デタッチ、および強制終了します

detached 画面でプログラムを実行できることは知っていますが、既存の画面にログインし、現在実行中のプロセスを強制終了し、再起動してから切り離します。

Bashスクリプトでそれを行うことは可能ですか、たとえばctrl-A、ctrl-D、Ctrl-Cを送信するにはどうすればよいですか?

2
user1506145

画面を削除する場合は、/var/run/screens/{user/の画面名を削除して、screen -wipeを実行することもできます。

しかし、画面には stuffpasteコマンドがあります:

  • コマンド:paste [registers [destination]]

    (C-a ], C-a C-])
    

    指定されたレジスタの(連結された)内容を現在のウィンドウの標準入力ストリームに書き込みます。レジスタ「。」はペーストバッファとして扱われます。パラメータが指定されていない場合、ユーザーは単一のレジスタを入力するよう求められます。ペーストバッファには、copy、history、readbufコマンドを入力できます。他のレジスタには、register、readreg、およびpasteコマンドを入力できます。 2番目の引数でpasteが呼び出された場合、指定されたレジスタの内容は、ウィンドウではなく名前付きの宛先レジスタに貼り付けられます。 「。」が2番目の引数として使用されている場合、ディスプレイの貼り付けバッファーが宛先です。貼り付けにはさまざまなリソースが使用されることに注意してください。通常、現在のウィンドウと現在のディスプレイの両方が必要です。ただし、2番目の引数が指定されている場合は、現在のウィンドウは必要ありません。ソース仕様にレジスターのみが含まれる場合(貼り付けバッファーではない)、レジスターはグローバルリソースであるため、現在のディスプレイ(接続された端末)は必要ありません。貼り付けバッファは、すべてのユーザーに対して1回存在します。

  • コマンド:stuff {string}

    現在のウィンドウの入力バッファに文字列stringを詰め込みます。これはpasteコマンドに似ていますが、オーバーヘッドがはるかに少なくなります。 stuffコマンドで大きなバッファを貼り付けることはできません。キーバインディングに最も役立ちます。 Bindkey を参照してください。


だからこれは動作します:

screen -S session_name -X at window_number stuff ^C
screen -S session_name -X at window_number stuff ^X

また、control-cとcontrol-xをそれぞれ送信し、キーコードを組み合わせて使用​​することもできます(control a、dなど)

1
Rinzwind

キーストロークをシミュレートする場合、きちんとしたスクリプト言語は「期待」です。

サンプルの期待スクリプトは次のようなものです。

spawn $env(Shell)
match_max 100000
send -- "screen\n"
expect eol
send -- "ls\n"
send -- "^Ad"
expect eof

これは次のコマンドで実行されます。

expect ./myscript
2
user98651