我有几个工作要按特定顺序提交。
首先,同时提交cal1st_1.sh
cal1st_2.sh
... cal1st_10.sh
等多个作业并同时处理。完成所有这些工作后,我有一份名为post_process.sh
的工作。然后,多个工作,例如cal2nd_1.sh
,cal2nd_2.sh
.... cal2nd_10.sh
,然后又post_process.sh
,我需要这样做四次。
我试着写一个像get_final.sh这样的脚本
#!/bin/bash
./cal1st_1.sh & ./cal1st_2.sh & ./cal1st_3.sh...... & ./cal1st_10.sh
./post_process.sh
./cal2nd_1.sh & ./cal2nd_2.sh & ./cal2nd_3.sh...... & ./cal2nd_10.sh
./post_process.sh
并使用命令nohup ./get_final.sh &
运行它,但它似乎不起作用,有时post_process.sh
启动,即使cal1st*sh
也未完成,有时cal1st*sh
不是'同时处理。有人能告诉我哪部分代码错了吗?如果您对我的代码有任何疑问,请发表评论。
修改
我写了一个像这样的脚本get_final.sh,你觉得它会起作用吗?我应该用nohup ./get_final.sh &
#!/bin/bash
pre_cal.sh
for i in `seq 1 13`; do
cal_dis_vel_strain_$i.sh &
done
wait
echo 1 > record
./post_cal.sh
...
答案 0 :(得分:1)
有人能告诉我哪部分代码错了吗?
错误的是你假设“后处理”任务在前一个“cal”进程完成之前不会启动。这不是&
的工作方式。 &
做的是让子进程在后台运行......而不是等待它完成。
执行您要执行的操作的方法是使用内置wait
命令,如下所述:
在这种情况下,每个后台进程(按任意顺序)都需要wait
。
(问题与nohup
无关。)
回应你的跟进:
这不对。对于每个子进程,您需要wait
。单个wait
只会等待一个进程。
一旦你解决了这个问题,就可以这样称呼它。但是,如果在脚本完成之前有可能断开会话,则只需要这样做。另一个替代方案是screen
程序......它允许您分离并重新连接会话。