ウォッチドッグ プロセスを使用して実行されている一部の Python プロセスで奇妙な問題が発生しています。
ウォッチドッグ プロセスは Python で記述された親であり、subprocess.Popenを使用して子プロセスを開くstart_child(name)という関数があります。Popen オブジェクトは、ウォッチドッグがpoll()を使用してプロセスを監視し、必要に応じて最終的にterminate()でプロセスを終了できるように記録されます。子が予期せず終了した場合、ウォッチドッグはstart_child(name)を再度呼び出し、新しい Popen オブジェクトを記録します。
7 つの子プロセスがあり、そのすべても Python です。子のいずれかを手動で実行すると、killを使用して SIGTERM または SIGINT を送信し、期待どおりの結果を得ることができます (プロセスは終了します)。
ただし、ウォッチドッグ プロセスから実行すると、子プロセスはFIRSTシグナルの後にのみ終了します。ウォッチドッグが子プロセスを再起動すると、新しい子プロセスは SIGTERM または SIGINT に応答しなくなります。何が原因なのかわかりません。
ウォッチドッグ.py
class watchdog:
# <snip> various init stuff
def start(self):
self.running = true
kids = ['app1', 'app2', 'app3', 'app4', 'app5', 'app6', 'app7']
self.processes = {}
for kid in kids:
self.start_child(kid)
self.thread = threading.Thread(target=self._monitor)
self.thread.start()
while self.running:
time.sleep(10)
def start_child(self, name):
try:
proc = subprocess.Popen(name)
self.processes[name] = proc
except:
print "oh no"
else:
print "started child ok"
def _monitor(self):
while self.running:
time.sleep(1)
if self.running:
for kid, proc in self.processes.iteritems():
if proc.poll() is not None: # process ended
self.start_child(kid)
したがって、watchdog.start()は 7 つのプロセスすべてを起動し、プロセス SIGTERM を送信するとプロセスが終了し、モニター スレッドが再びプロセスを開始します。ただし、新しいプロセス SIGTERM を送信すると、それは無視されます。
再起動されたプロセスに kill -15 を何度も送信し続けることができるはずです。再起動後に無視されるのはなぜですか?