私はかなり多くのコードを継承し、時間ごとにサービスを再起動するクローンの作業を見ています。他のスクリプトはこのプロセスに触れ、このコードを実行しません。
#The name of the process has been scrubbed to protect the guilty
procpid=$( pidof proc )
if [ -n "$procpid" ]; then
kill -HUP $procpid
procpid=$( pidof proc )
if [ -z "$procpid" ]; then
error "PROC ain't running, go figure out why"
fi
fi
これは99.9999%の時間動作します。問題は、私は説明できないsyslogメッセージが電子メールで送信されるのを嫌う5-9人だということです。その理由は次のとおりです。
Kill:(1076) - そのプロセスはありません。
そこに現れ続けます。これは必ずしも「if」と「kill」の間に私のプロセスを殺す他の何かがあることを意味しますか、それとももっと狡猾なことが進んでいますか?
このコードは問題なく、他のコードが実際に2行の間のプロセスを終了する可能性が非常に高いので、少なくともこれらの警告が表示される理由をデバッグするために使用できる「何が私を殺したのか」診断クラスチェッカーがありますか?
ベストアンサー1
pidof
もはや、特に関連プロセスの性格を知らずに、私はそれが間に消えているようだと言わなければなりませんkill
。killall
基本的に完全なコードブロックの代わりに。競争条件は依然として存在しますが、期間は短くなります。
このコードは問題なく、他のコードが実際に2行の間のプロセスを終了する可能性が非常に高いので、少なくともこれらの警告が表示される理由をデバッグするために使用できる「何が私を殺したのか」診断クラスチェッカーがありますか?
UNIXにはシグナルが記録されていないため、通常「何が私を殺したのか」を知る方法はありません。少なくとも簡単にできることは、ラッパーシェルスクリプトで関連プロセスを実行することです。少なくともプロセスが終了した理由を記録します。
#!/bin/sh
proc
logger "proc died with status $?"
$?
プロセスが正常に終了すると 0 ~ 127 で、信号の受信によりプロセスが終了すると 128 より大きく、信号番号は$?
-128 です。