シェルスクリプト: 画面を実行し、複数の画面を開いて、各画面でコマンドを実行します。

シェルスクリプト: 画面を実行し、複数の画面を開いて、各画面でコマンドを実行します。

タイトル通りです:

私のシェルスクリプトは

  • コマンドAを実行し、完了するまで待つ
  • 「スクリーン」を実行する
  • 初期画面でコマンドB1を実行する
  • 新しいウィンドウを開く(通常はCmd-ac経由)
  • 新しいウィンドウでコマンドB2を実行する
  • 新しいウィンドウを開く
  • 新しいウィンドウでコマンドB3を実行する

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

答え1

バックグラウンドで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いずれかのプログラムが終了した場合、各プログラムでシェルが開始されるため、ウィンドウは閉じません(必要に応じて使用できます)。

- または -ウィンドウごとに 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

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

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、セッションを作成した後にこれを追加します (ただし、zombieに設定されていない場合は.screenrc、これがおそらくデフォルトです)。

screen -S mysession -X zombie

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

関連情報