1

daemonコマンド(RHEL 6.2)を使用してデーモン化されたJavaプロセスがあります。次の行を使用してプロセスを開始し、以下の行を使用してプロセスを停止しています。

daemon --command "/opt/my-service" --respawn --name=my-service --verbose
daemon --stop --name=my-service --verbose  

停止/開始アプローチを使用してプロセスを再開しようとするまで、物事は機能します。

daemon --stop --name=my-service --verbose
daemon --command "/opt/my-service" --respawn --name=my-service --verbose

上記のコマンドが実行される前にプロセスが実行されている場合、既存のプロセスは停止されますが、新しいプロセスは作成されません。代わりに、次の行が:に記録されます/var/log/messages

Oct 27 07:59:46 myhostname my-service: my-service: fatal: failed to become a daemon: Resource temporarily unavailable

これは、私が理解している限り、pidファイルのロックを取得しようとしたが、別のプロセスがそのロックを保持していたことを意味します。つまり、元のプロセスはまだ実行されていました。

興味深いことに、次のコマンドでは再現できません。

daemon --command "sleep 30s" --respawn --name=sleeper --verbose
daemon --stop --name=sleeper --verbose
daemon --command "sleep 30s" --respawn --name=sleeper --verbose

次に、の非同期性を引き起こす/悪用する何かが私のプロセスにあるに違いありません--stop

どうすれば--stopブロッキングできますか?

4

1 に答える 1

0

これは役立つかもしれません:

while true; do
  daemon --name=my-service --running --verbose | grep not
  [ $? -eq 0 ] && exit
  sleep 1
done

pコードとしての説明:forever { はいの場合daemon --name=my-service --running --verboseは単語を含むものが返されるかどうかを確認し、 そうでない場合は }notexitsleep a second

于 2012-10-27T17:14:30.277 に答える