0

./abcd.sh #thisスクリプトは、/ tmp /abcd/にzipファイルを作成するためのJavaコードを実行します。

abcd.shスクリプトがzipファイルを作成するのに30秒かかる場合もあれば、作成するのに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ファイルが作成されても待ちたくありません。

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"

...等。お役に立てれば。

于 2012-11-20T19:15:04.927 に答える
1

いくつかの調査を行った後、Javaコードを実行するためにインスタンス化するzipファイルとシェルスクリプト(abcd.sh)を作成するJavaコードを制御できないため、このアプローチは不可能である可能性があるという結論に達しました。

私が取ったアプローチは次のとおりです。

  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 に答える