./ abcd.sh #this脚本负责在/ tmp / abcd /
中运行用于创建zip文件的java代码有时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
我知道睡眠是替代方案,但即使创建了zip文件,我也不想等待。
答案 0 :(得分:1)
如果您知道“zip”程序的名称,可以在进程列表中找到它,然后确定其进程ID。假设您正在等待的进程名称只是“zip”,您可以使用以下内容:
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"
...等。希望这会有所帮助。
答案 1 :(得分:1)
经过一些研究后,我得出结论,这种方法可能无法实现,因为我无法控制创建zip文件的Java代码和实例化运行java代码的shell脚本(abcd.sh)
我采取的方法是:
/usr/sbin/lsof /path/to/zip/abcd.zip
查找zip文件是否仍在写入/打开,使用此命令我将$? 0
如果文件正在写入/打开,如果文件已完成/关闭,我将获得$? 1
。 $?
置于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
如果你有更好的方法,请告诉我。