我已经浏览了几篇关于 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 … &
。第一个命令告诉wget
fork 一个子进程然后退出:
(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{!}
?它将等待所有后台进程完成后再继续。