0

我有这段代码:

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。最后,如果仍然有一个正在运行,我只想等待但不要循环数百万次,但可能会睡一分钟:

提前感谢您的任何建议!

4

1 回答 1

4

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

使用名为 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

于 2012-09-12T04:56:22.757 回答