我有这段代码:
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。最后,如果还有一个正在运行,我想等待但不会循环数百万次,但可能会睡一会儿:
提前感谢任何建议!
答案 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
。