我有一个通过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)
答案 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.*'