`wait`は`wget --Background`を待ちません。

`wait`は`wget --Background`を待ちません。

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{!}か?続行する前に、すべてのバックグラウンドプロセスが完了するのを待ちます。

関連情報