0

我有一个通过 Crontab 执行的 shell 脚本。shell 脚本正在正确地创建 Sqlplus 作业并且它们运行完成。不工作的是最后的 while 循环,我希望脚本等待所有 Sqlplus 作业完成。

如果我手动执行这个 shell 脚本,最后的 while 循环可以正常工作,并且 shell 脚本在所有 Sqlplus 作业完成之前不会退出。

如何在通过 Crontab 运行时获得 while 循环以查看 Sqlplus 作业?

#!/bin/bash
cd /some/path/to/folder

source ~/.profile

echo 'Run started'
echo $(date)

i=0
while [ $i -lt 12 ]
do
    echo 'Starting process ' $i

    sqlplus username/password@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SID=SERVERSID)))' @import.sql $i > import_batch$i.log &

    let i=$i+1
done

while [ $(ps -a | grep -w -c 'sqlplus') -ne 0 ] //This is not working in Crontab
until [[ -z $(pgrep -flx 'sqlplus') ]] //I've also tried this (instead of the while in my script) without success in Crontab
do
    sleep 60
done

echo 'Run completed'
echo $(date)
4

3 回答 3

3

根据我上面的评论,使用“等待”等待该进程拥有的所有进程完成。例如:

#!/bin/bash
cd /some/path/to/folder

source ~/.profile

echo 'Run started'
echo $(date)

i=0
while [ $i -lt 12 ]
do
    echo 'Starting process ' $i

    sqlplus username/password@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SID=SERVERSID)))' @import.sql $i > import_batch$i.log &

    let i=$i+1
done

wait

echo 'Run completed'
echo $(date)
于 2013-04-28T17:53:29.867 回答
1

也许您需要ps -ax在 crontab 案例中使用?

while [ $(ps -ax | grep -w -c 'sqlplus') -ne 0 ]

编辑 2013-04-27:从头开始,这很愚蠢。正如 linuts 建议的那样,只需使用wait.

#!/bin/bash
cd /some/path/to/folder

source ~/.profile

echo 'Run started'
echo $(date)

i=0
while [ $i -lt 12 ]
do
    echo 'Starting process ' $i

    sqlplus username/password@'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=server)(PORT=1521))(CONNECT_DATA=(SID=SERVERSID)))' @import.sql $i > import_batch$i.log &

    let i=$i+1
done

wait
echo 'Run completed'
echo $(date)
于 2013-04-24T14:05:32.113 回答
1

尝试使用

ps -axww | grep -w 'sqlplus' | grep -v grep | wc -l

因为ps -axww | grep -w -c 'sqlplus'将始终包含 1 行grep -w -c 'sqlplus'命令

或者,尝试使用以下来sqlplus完全匹配模式或作为正则表达式

pgrep -fl 'sqlplus'
pgrep -flx '.*sqlplus.*'
于 2013-04-27T15:42:26.330 回答