0

./abcd.sh #这个脚本负责运行一个java代码在/tmp/abcd/中创建一个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

我知道sleep是一种替代方法,但即使创建了 zip 文件,我也不想等待。

4

2 回答 2

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"

...ETC。希望这可以帮助。

于 2012-11-20T19:15:04.927 回答
1

在做了一些研究之后,我得出一个结论,这种方法可能是不可能的,因为我无法控制创建 zip 文件的 java 代码和实例化运行 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

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

于 2012-11-21T19:57:25.647 回答