0

私はこのコードを持っています:

sqlplus usr1/pw1@DB1 @$DIR/a.sql $1 &
sqlplus usr2/pw2@DB2 @$DIR/b.sql $1 &
wait
echo "Done!"

バックグラウンドで両方の sqlplus セッションを同時に実行できるようにし、両方が終了するまで待機するコマンドを待ちます。

実際のプログラムでは、「エコー」は実際には、以前に実行されたクエリによってスプールされたファイルで動作する別のプログラムへの呼び出しであるため、両方が終了するのを待つことが重要です。

自分で実行するとうまくいくのに、crontabでスケジュールするとうまくいかないので問題があります。解決策が見つからないようなので、何とかその動作をシミュレートしたいと思います。これは私の考えです:

sqlplus usr1/pw1@DB1 @$DIR/a.sql $1
session1=$! //I think this stores sqlpluss pid
sqlplus usr2/pw2@DB2 @$DIR/b.sql $1
session2=$!

while (not finished($session1) and not finished($session2)) //pseudocode
  do nothing //maybe sleep for a few seconds, something that wont waste resources unnecesarally

echo "Done!"

そのループを完了する方法について助けが必要です。まず、$session1 と $session2 には各 sqlplus セッションの pid があると仮定しています。それが正しいかどうかはよくわかりません。次に、プロセスがまだ実行されているかどうかを確認する簡単な方法が必要です。最後に、どちらかがまだ実行されている場合は、何百万回もループせずに待機したいだけで、1 分間スリープすることもできます。

提案をお寄せいただきありがとうございます!

4

1 に答える 1

4

crontab の下にあるときに、スクリプトで待機を使用できないのはなぜですか? 私の場合、それは可能です。

以下のように 1.sh という名前のファイルを使用します。

#!/bin/bash
exec 2>&1
sleep 20&
time wait
echo hello

以下のようなcrontabのタスク:

* * * * * bash ~/1.sh > ~/1.txt

実行に 20 秒かかるため、待機が機能していることを示すことができます。

$cat ~/.logs/1.txt

real    0m20.001s
user    0m0.000s
sys     0m0.000s
hello

crontab で待機が機能しない理由をデバッグしてみてください。POSIX sh のような別のシェルの代わりに bash を使用していますか? 動作は異なる場合があります。

うまくいかない場合waitは、試してみてくださいflock

于 2012-09-12T04:56:22.757 に答える