2012-11-20 28 views
0

的結果./abcd.sh#此腳本負責運行Java代碼在/ tmp/ABCD/想知道PID腳本

有些時候,創建一個zip文件abcd.sh腳本需要30秒創建一個zip文件,有時需要60秒才能創建。

因爲我沒有編輯abcd.sh文件的權限,所以我編寫了這段代碼來獲取./abcd.sh的pid,但不知道如何獲取其子進程的pid。

./abcd.sh & 
pid=$! 
wait $pid 

此代碼正在等待直到./abcd.sh執行,但它不會等到zip文件完成。

有什麼辦法可以等到zip文件創建?我的想法是,如果我們知道創建zip文件的pid,我們可以使用wait $ zipfilepid,但不知道如何獲得用於創建zip文件的pid。

.abcd.sh 
sleep 60 

我知道睡眠就是一個這樣的選擇,但我不希望即使在創建壓縮文件等。

+1

您正在編輯錯誤的腳本。更改'abcd.sh'以便它等待壓縮文件完成將變得更加容易和更加健壯。你不能可靠地等待一個不是你的孩子的過程。 –

+0

這就是問題所在,我沒有編輯abcd.sh文件的權限? – phani

+0

爲什麼不移除'&'腳本會自動等待。 –

回答

1

如果您知道「zip」程序的名稱,您可以在進程列表中找到它,然後確定其進程ID。假設你在等待的過程中的名稱就是「壓縮」,你可以使用這樣的事情:

PROCNAME="zip" 
PROCRUN=`ps h -ef|egrep -e "$PROCNAME"|grep -v " $$ "` 
PIDS=`echo "$PROCRUN"|tr -s " "|cut -d" " -f2` 
wait $PIDS 

這將多個PID的工作。您可能需要改變PROCNAME變量的值,以更好地針對特定的進程,如:

PROCNAME=" zip " 
PROCNAME="zip name-of-file-to-zip" 
PROCNAME="zipscriptname" 

...等。希望這可以幫助。

+0

對不起,沒有告訴這個前期,zip文件是由java代碼創建,abcd.sh正在調用該java代碼來創建一個zip文件。 – phani

+0

@phani - 只要你可以運行一個shell腳本,你仍然可以獲取你正在調用的java代碼的進程ID並等待它完成。您只需要知道進程中的命令行文本,因爲它出現在'ps -ef'命令中。如果你正在運行java執行命令,它可能看起來像'java -cp zipstuff.jar com.domain.mystuff',所以這就是你將用於'PROCNAME'的字符串。這有幫助嗎? –

1

做了一些研究之後,我得出一個結論,這種做法是不可能的,因爲我沒有控制權的Java代碼創建一個zip文件,被實例化運行Java shell腳本(abcd.sh)碼。

,我採取的方法是:

  1. 找出是否zip文件還在寫/打開使用/usr/sbin/lsof /path/to/zip/abcd.zip,用這個命令我將$? 0如果文件被寫入/打開,我得到$? 1如果文件已完成/關。
  2. $?放入while循環,並且如果$? -eq 0進入睡眠狀態,則退出程序。

/usr/sbin/lsof /path/to/zip/abcd.zip
rc=$?
while [ $rc -eq 0 ]
do
echo "Zip file is still creating, sleeping for 3 seconds"
sleep 3
done

請讓我知道,如果你有更好的辦法。