通过Crontab执行shell脚本时,无法找到运行的SqlPlus进程

时间:2013-04-24 12:46:44

标签: bash shell crontab

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

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

如何在通过Crontab运行时看到Sqlplus作业的最后一个while循环?

#!/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)

3 个答案:

答案 0 :(得分:3)

根据我上面的评论,使用“wait”等待此进程拥有的所有进程进行清除。 e.g:

#!/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)

答案 1 :(得分:1)

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

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)

答案 2 :(得分:1)

尝试使用

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

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

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

pgrep -fl 'sqlplus'
pgrep -flx '.*sqlplus.*'