`wait` 不等待 `wget --background`

`wait` 不等待 `wget --background`

我已经浏览了几篇关于 unix wait 命令的 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 … &。第一个命令告诉wgetfork 一个子进程然后退出:

(bash)

  fork ——————————————→
  wait                  exec wget --background …
   ⋮                    fork ———————————————————————→
      ←——————————————   exit                           download
  (next script line)                                             ⋮

当父wget进程(即前台)返回时,bash 恢复该进程的执行。使用wget … &,shell 会分叉一个后台进程:

(bash)

  fork ——————————————————→
  (next script line)       exec wget --background …

                           download

这种情况下,可以等待wget进程退出:

wget … &
wait $!

但这是没有意义的:启动后台作业只是为了等待它,这相当于启动前台作业。

wget …

答案2

按照建议,你们都可以尝试该命令

wait
#instead of 
wait$!

因为我真的怀疑是否有任何名为wait$!也许你想要的命令正在使用wait $!

或者因为它是一个 cron 脚本,您可以禁用 wget 选项,--background因为您想等待此命令结束而不是将其放在后台。

答案3

你有没有尝试过wait{!}?它将等待所有后台进程完成后再继续。

相关内容