Unixの待機コマンドに関するいくつかのSE投稿を見つけましたが、それらのどれも私の問題を解決できませんでした。実行する天気予報モデルがあります。まず、いくつかのフォルダを準備し、wgetを使用してデータをダウンロードしてから予測を実行します。速度が遅いため、データのダウンロードに最大30〜60分かかることがあります。データのダウンロードが開始されると、データが準備される前にプログラムがコマンドを実行します。以下は、実行を開始するための私のcrontabエントリです。
15 09 * * * /bin/bash /home/zmumba/WRF/SCRIPTS/wrf_run_00.sh &
9月15日に日間、週間、月間で実行されます。
wrf_run_00.shで実行するファイルは次のとおりです。
!/bin/bash
year=`date "+%Y"`
month=`date "+%m"`
day=`date "+%d"`
source /home/zmumba/.bashrc
perl /home/zmumba/WRF/SCRIPTS/wrf_Namelists_and_Dirs_00_Daily.pl
perl /home/zmumba/WRF/SCRIPTS/download-file_gen00.pl
wget --directory-prefix=/home/zmumba/WRF/DATA/${year}${month}${day}00 --background --continue --progress=bar --input-file=/home/zmumba/WRF/SCRIPTS/download-file-list-one_deg_00.txt
wait$!
cd /home/zmumba/WRF/WPS
モデルを実行するための残りのコマンドは次のとおりです。どんな助けでも大変感謝します。
答え1
wait$!
構文エラーです。空白がありません。実際にはバックグラウンドジョブを開始しないため、$!
空白のままになり、コマンドが引数を使用せずにすべてのバックグラウンドジョブを待機するため、ここでは何の効果もありません。wait
バックグラウンドジョブがないため、すぐに返されます。
wget --background …
との使用には違いがありますwget … &
。最初のコマンドは、wget
子プロセスをフォークしてから終了するように指示します。
(bash)
fork ——————————————→
wait exec wget --background …
⋮
⋮ fork ———————————————————————→
←—————————————— exit download
(next script line) ⋮
親wget
プロセス(つまり前景)が返されると、bashはプロセスの実行を再開します。を使用すると、wget … &
シェルはバックグラウンドプロセスを分岐します。
(bash)
fork ——————————————————→
(next script line) exec wget --background …
download
⋮
この場合、wgetプロセスが終了するのを待つことができます。
wget … &
wait $!
しかし、これは言葉ではありません。バックグラウンドジョブを開始して待つだけは、フォアグラウンドジョブを開始するのと同じです。
wget …
答え2
提案したように、すべてのコマンドを試すことができます
wait
#instead of
wait$!
wait$!
おそらく、あなたが望むコマンドが使用されているかどうか疑わしいからです。wait $!
あるいは、cronスクリプトなので、--background
このコマンドをバックグラウンドにするのではなく完了するのを待ちたいので、wgetオプションを無効にすることもできます。
答え3
試してみましたwait{!}
か?続行する前に、すべてのバックグラウンドプロセスが完了するのを待ちます。