0

我有几份工作,我想按一定的顺序提交。首先,像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

并用 command: 运行它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

...
4

1 回答 1

1

有人可以告诉我我的代码的哪一部分是错误的吗?

这是错误的,您假设“后处理”任务在之前的“校准”流程完成之前不会启动。这不是行之有效的方式&。什么&是让子进程在后台运行......而不等待它完成。

做你想做的事情的方法是使用内置wait命令,如下所述:

在这种情况下,您将需要wait为每个后台进程(以任何顺序)。

(问题与 . 无关nohup。)


回应您的跟进:

  1. 这是不正确的。您需要wait为每个子进程。一个wait只会等待一个进程。

  2. 一旦你解决了这个问题,你就可以这样称呼它。但是,只有在脚本完成之前您的会话有可能断开连接时,您才需要这样做。另一种选择是screen程序......它允许您分离和重新连接会话。

于 2013-09-10T01:28:01.017 回答