想知道脚本结果的pid

时间:2012-11-20 18:39:53

标签: linux bash shell wait pid

./ 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文件,我也不想等待。

2 个答案:

答案 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)

我采取的方法是:

  1. 使用/usr/sbin/lsof /path/to/zip/abcd.zip查找zip文件是否仍在写入/打开,使用此命令我将$? 0如果文件正在写入/打开,如果文件已完成/关闭,我将获得$? 1
  2. $?置于while循环中,如果$? -eq 0进入睡眠状态,则退出程序。
  3. /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

    如果你有更好的方法,请告诉我。