У меня странная проблема с некоторыми процессами Python, работающими с использованием процесса сторожевого таймера.
Процесс сторожевого таймера написан на python и является родительским, и имеет функцию с именем start_child(name), которая использует subprocess.Popen для открытия дочернего процесса. Объект Popen записывается, чтобы сторожевой таймер мог отслеживать процесс с помощью poll() и, в конечном итоге, завершать его с помощью terminate(), когда это необходимо. Если дочерний элемент неожиданно умирает, сторожевой таймер снова вызывает start_child(name) и записывает новый объект Popen.
Есть 7 дочерних процессов, все они тоже python. Если я запускаю любой из дочерних процессов вручную, я могу отправить SIGTERM или SIGINT с помощью kill и получить ожидаемые результаты (процесс завершается).
Однако при запуске из сторожевого процесса дочерний процесс завершится только после сигнала FIRST. Когда сторожевой таймер перезапускает дочерний процесс, новый дочерний процесс больше не отвечает на SIGTERM или SIGINT. Я понятия не имею, что вызывает это.
watchdog.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 перезапущенным процессам. Почему они игнорируют его после перезапуска?