2011-06-19 10 views
2

長い実行プロセスのシェルスクリプトを書いています。 まず、画面セッションマネージャですべてのコマンドを実行する必要があります。そのため、ユーザーが切断されてもプロセスの実行は終了しません。 後で作成するバックグラウンドプロセスが終了するのを待って、次のプロセスを開始する必要があります。シェル:screenを使って、シェルスクリプトのいくつかのバックグラウンドプロセスを待つ方法

私の質問は、シェルスクリプトでスクリーンセッションを開始し、バックグラウンドプロセスが終了するのを待つ方法です。事前

答えて

2

おかげであなたはscreen scriptを行う必要があり、実行中のプロセスにscreen(またはnohup)を呼び出すことはできません。しかし、あなたはnohupのやり方でSIGHUPを捕まえ、出力をファイルにリダイレクトすることができます。

exec > OUT 2>&1 
trap '' 1 

、バックグラウンドプロセスを待ち、それを作成する際のpidを保存してからちょうど仕上げに至るまで待つ

foo& 
PID1=$! 
bar& 
PID2=$1 
wait $PID1 $PID2 

または代わりを待って呼び出します。

foo& 
bar& 
wait 
+0

うまくいきました。私は文字列変数のforループ中にPIDを収集しました。エラーはPIDの間にスペース文字がないということでした...私の失敗:D – buffkit

5

「スクリプティング画面」のgoogle検索では、最初の結果としてthisが返されます。 screen -d -m -S nameOfSessionで名前付きスクリーンセッションを作成できるようです。次にscreen -X -S <session name> screenは、スクリーンセッション 'nameOfSession'にウィンドウを作成します。あなたは

screen -X -S test -p 1 stuff "your command here ^M" 

を使用して、このウィンドウ1(すなわち、実行するには、この画面のセッション・ウィンドウ1のためのコマンドを与える)と通信できる「your_command_hereは」あなたが実行したいコマンドです。 ^Mは、キャリッジリターン制御文字です(端末にはCtrl-V、次にEnter/Returnと入力します)。^Mは本質的に "return return/enter"を押すので、この画面セッションでコマンドが実行されます。それで遊んでください。

あなたが終了するのあなたのコマンドを待ちたいので、私はアンパサンドを経由して、プロセスをforkを示唆している:

your_command & を直後、プロセスのフォークのプロセスIDは$です! waitを実行すると、すべてのバックグラウンドプロセスの実行が完了するまで待つことができます。

私はscreen referenceを提案します。

関連する問題