it-swarm-ja.com

シェルスクリプト:画面を実行し、いくつかの画面を開いて、それぞれでコマンドを実行します

タイトルの内容:

私のシェルスクリプトは

  • コマンドAを実行し、完了するまで待ちます
  • 「screen」を実行する
  • 初期画面でコマンドB1を実行します
  • 新しいウィンドウを開きます(通常はCmd-a-c経由)
  • 新しいウィンドウでコマンドB2を実行します
  • 新しいウィンドウを開く
  • 新しいウィンドウでコマンドB3を実行します

それだけです。ボーナスポイントは得られますが、一部(またはすべて)が完了するまで待つ必要はありません。どうすればこれを行うことができますか?

1
FooBar

バックグラウンドを開始しますscreenセッションに「mysession」という名前を付けます。

screen -d -m -S mysession

最初のウィンドウでtopを実行します

screen -S mysession -X exec top

別のウィンドウを開始し、「win1」という名前を付けて、その中で「vmstat 10」を実行します

screen -S mysession -X screen -t win1
screen -S mysession -p win1 -X exec vmstat 10

別のウィンドウを開始し、「win2」という名前を付けて、その中で「iostat 30」を実行します

screen -S mysession -X screen -t win2 
screen -S mysession -p win2 -X exec iostat 30

接続してセッションを表示するには:

screen -x -S mysession

プログラムのいずれかが終了した場合、screenがそれぞれでシェルを開始するため(必要に応じて使用できます)、ウィンドウは閉じません。

-OR-ウィンドウごとに1つのコマンドのみが必要な場合、またはプロセスの完了後にさらに簡単にクリーンアップしたい場合は、デフォルトのシェルを実行しないでください。各ウィンドウ、コマンドのみ:

screen -d -m -S mysession top
screen -S mysession -p 0 -X title win0    # optional!
screen -S mysession -X screen -t win1 vmstat 10
screen -S mysession -X screen -t win2 iostat 30

screenは、プロセスが終了するか、ウィンドウをシャットダウンするときに、ウィンドウを「終了」します(ウィンドウの内容はそのままにしておく可能性があります。以下のzombieを参照)。

screen -S mysession -X quit   # nuke whole the session

または

screen -S mysession -p win2 -X kill
screen -S mysession -p win1 -X kill
screen -S mysession -p 0 -X kill

(これにより、実行中のプロセスが強制終了される場合と強制終了されない場合がありますが、screenはそれぞれにSIGHUPを送信します)

screenでウィンドウを自動的に閉じ、すべてのプロセスが完了したら終了する場合は、セッションの作成後にこれを追加します(ただし、.screenrczombieが設定されていない場合は、とにかくおそらくデフォルトです):

screen -S mysession -X zombie

これにより、「ゾンビ」の閉じるキーと復活キーの設定が解除され、各ウィンドウのコマンドが終了するとウィンドウが消え、最後のウィンドウが終了するとscreen自体が閉じます。 (defzombieの代わりにzombieを使用する必要があるかもしれませんが、ドキュメントが反対であるにもかかわらず、後者のみが機能します。)

1
mr.spuratic