Saya mengalami masalah aneh dengan beberapa proses python yang berjalan menggunakan proses pengawas.
Proses pengawas ditulis dengan python dan merupakan induknya, serta memiliki fungsi bernama start_child(name) yang menggunakan subprocess.Popen untuk membuka proses anak. Objek Popen dicatat sehingga pengawas dapat memantau proses menggunakan poll() dan akhirnya mengakhirinya dengan terminate() bila diperlukan. Jika anak tersebut meninggal secara tidak terduga, pengawas akan memanggil start_child(name) lagi dan mencatat objek Popen yang baru.
Ada 7 proses anak, semuanya juga python. Jika saya menjalankan salah satu turunan secara manual, saya dapat mengirim SIGTERM atau SIGINT menggunakan kill dan mendapatkan hasil yang saya harapkan (proses berakhir).
Namun, ketika dijalankan dari proses pengawas, anak hanya akan berakhir setelah sinyal FIRST. Ketika pengawas memulai ulang anak tersebut, proses anak baru tidak lagi merespons SIGTERM atau SIGINT. Saya tidak tahu apa yang menyebabkan ini.
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)
Jadi yang terjadi adalah watchdog.start() meluncurkan semua 7 proses, dan jika saya mengirim proses apa pun SIGTERM, proses itu akan berakhir, dan thread monitor memulainya lagi. Namun, jika saya mengirim proses baru SIGTERM, itu mengabaikannya.
Saya harus dapat terus mengirimkan kill -15 ke proses yang dimulai ulang berulang kali. Mengapa mereka mengabaikannya setelah di-restart?