2012-11-20 31 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

请让我知道,如果你有更好的办法。