2012-09-12 71 views
0

完成我有這樣的一段代碼:如何等待後臺作業在外殼

sqlplus usr1/[email protected] @$DIR/a.sql $1 & 
sqlplus usr2/[email protected] @$DIR/b.sql $1 & 
wait 
echo "Done!" 

在後臺兩個sqlplus的會議,使他們能夠在同一時間運行,並等待命令要等到雙方的他們完成。

在真實程序中,「echo」實際上是對另一個程序的調用,該程序通過先前執行的查詢對假脫機文件起作用,因此需要等待它們完成。

我有一個問題,因爲當我自己執行它時它工作正常,但它不會在我將其安排在crontab上時發生。由於我似乎無法找到解決方案,我想以某種方式模擬該行爲。這是我的想法:

sqlplus usr1/[email protected] @$DIR/a.sql $1 
session1=$! //I think this stores sqlpluss pid 
sqlplus usr2/[email protected] @$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

爲什麼在crontab下你的腳本中不能使用wait?就我而言,它可以。

有了如下命名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 

現在也許你可以嘗試調試爲什麼wait不能在你的crontab中工作。你確定你正在使用bash而不是像POSIX sh這樣的其他shell嗎?行爲可能不同。

如果你不能得到wait工作,你可以嘗試flock

+0

+1等待。它也沒有價值,沒有參數,'wait'將等待所有*後臺進程。 「男人等待」(然後搜索它,因爲它是內置的)有更多的信息。 – jedwards