如何等待后台作业在shell中完成

时间:2012-09-12 03:50:13

标签: shell process crontab

我有这段代码:

sqlplus usr1/pw1@DB1 @$DIR/a.sql $1 &
sqlplus usr2/pw2@DB2 @$DIR/b.sql $1 &
wait
echo "Done!"

后台的两个sqlplus会话因此可以同时运行,并等待命令等待它们都完成。

在真实程序中,“echo”实际上是对另一个程序的调用,该程序通过先前执行的查询处理假脱机文件,因此等待它们完成的重要性。

我有一个问题,因为它在我自己执行它时工作正常,但是当我在crontab上安排它时它不会。由于我似乎无法找到解决方案,我想以某种方式模拟该行为。这是我的想法:

sqlplus usr1/pw1@DB1 @$DIR/a.sql $1
session1=$! //I think this stores sqlpluss pid
sqlplus usr2/pw2@DB2 @$DIR/b.sql $1
session2=$!

while (not finished($session1) and not finished($session2)) //pseudocode
  do nothing //maybe sleep for a few seconds, something that wont waste resources unnecesarally

echo "Done!"

我需要一些关于如何完成循环的帮助。首先,我假设$ session1和$ session2具有每个sqlplus会话的pid。不确定这是否正确。然后,必须有一些简单的方法来检查进程是否仍在运行,具有它的pid。最后,如果还有一个正在运行,我想等待但不会循环数百万次,但可能会睡一会儿:

提前感谢任何建议!

1 个答案:

答案 0 :(得分:4)

为什么不能在crontab下使用脚本中的wait?就我而言,它可以。

使用名为1.sh的文件,如下所示:

#!/bin/bash
exec 2>&1
sleep 20&
time wait
echo hello

和crontab中的任务如下:

* * * * * bash ~/1.sh > ~/1.txt

可以看出等待正在运行,因为执行时间为20秒:

$cat ~/.logs/1.txt

real    0m20.001s
user    0m0.000s
sys     0m0.000s
hello

现在也许您可以尝试调试为什么等待在您的crontab中不起作用。你确定你使用bash而不是像POSIX sh这样的另一个shell吗?行为可能不同。

如果您无法wait工作,可以尝试flock