Bash 通过Crontab执行shell脚本时找不到正在运行的SqlPlus进程

Bash 通过Crontab执行shell脚本时找不到正在运行的SqlPlus进程,bash,shell,crontab,Bash,Shell,Crontab,我有一个通过Crontab执行的shell脚本。shell脚本正确地创建了Sqlplus作业,并且它们一直运行到完成。最后的while循环不起作用,我希望脚本等待所有Sqlplus作业完成 如果我手动执行这个shell脚本,那么最后的while循环工作正常,并且shell脚本在所有Sqlplus作业完成之前不会退出 如何让末尾的while循环在通过Crontab运行时看到Sqlplus作业 #!/bin/bash cd /some/path/to/folder source ~/.profil

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

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

如何让末尾的while循环在通过Crontab运行时看到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)

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

while [ $(ps -ax | grep -w -c 'sqlplus') -ne 0 ]
编辑2013-04-27:划破它,那是愚蠢的。正如linuts所建议的,只需使用


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

while [ $(ps -ax | grep -w -c 'sqlplus') -ne 0 ]
编辑2013-04-27:划破它,那是愚蠢的。正如linuts所建议的,只需使用

试用

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.*'
试用

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.*'

根据我上面的评论,使用“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)

根据我上面的评论,使用“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)


我更新了脚本以尝试-ax选项。这是一个非常大的作业,每天运行一次,直到明天我才知道它是否有用。它昨晚运行,但while循环仍然没有使用-ax选项。这是在Linux系统上运行的吗?您可以尝试使用
while[pidof-s sqlplus]
while[pgrep sqlplus]
。。。一定要先手动测试。是的。我更新了循环以执行
,直到[[-z$(pgrep-flx'sqlplus')]
。我将在周末看看它是如何工作的。pgrep和pidof在这台机器上不可用(我没有能力添加它或要求添加它),我更新了脚本以尝试-ax选项。这是一个非常大的作业,每天运行一次,直到明天我才知道它是否有用。它昨晚运行,但while循环仍然没有使用-ax选项。这是在Linux系统上运行的吗?您可以尝试使用
while[pidof-s sqlplus]
while[pgrep sqlplus]
。。。一定要先手动测试。是的。我更新了循环以执行
,直到[[-z$(pgrep-flx'sqlplus')]
。我将在周末看看它是如何工作的。这台机器上没有pgrep和pidof的运气(我没有能力添加它或要求添加它)你有什么理由不能只使用“等待”吗?对不起,我不确定你的意思。去掉整个while/until循环,用“等待”替换它wait'等待当前进程拥有的所有后台进程退出。以交互方式尝试:sleep 2和sleep 3&wait@linuts:你完全正确。在给出愚蠢的答案之前,我应该先整理一下我对UNIX作业控制的记忆。你应该把你的评论作为答案,我认为你做到了,应该得到赏金。我更新了我的脚本,使用等待而不是循环。明天一早运行后我会知道更多。你有什么理由不能使用“等待”吗?对不起,我不知道你的意思。去掉整个while/until循环,用“等待”替换它wait'等待当前进程拥有的所有后台进程退出。以交互方式尝试:sleep 2和sleep 3&wait@linuts:你完全正确。在给出愚蠢的答案之前,我应该先整理一下我对UNIX作业控制的记忆。你应该把你的评论作为答案,我认为你做到了,应该得到赏金。我更新了我的脚本,使用等待而不是循环。明天一早运行后我会知道更多匹配在bash脚本中运行,我认为这与ps和pgrep在通过crontab执行时找不到正在运行的sqlplus作业有关。您是否尝试将
ps-ax
的输出保存在一个单独的文件中,以便查看与
grep
匹配的内容?不,我没有,我会这样做,然后看看我得到了什么。但是,我已经手动运行了相同的脚本,它将等待sqlplus作业完成。匹配在bash脚本中工作,我认为这与ps和pgrep在通过crontab执行时找不到正在运行的sqlplus作业有关。您是否尝试将
ps-ax
的输出保存在一个单独的文件中,以便查看与
grep
匹配的内容?不,我没有,我会这样做,然后看看我得到了什么。不过,我已经手动运行了相同的脚本,它将等待sqlplus作业完成。