ฉันมีปัญหาแปลก ๆ กับกระบวนการหลามบางกระบวนการที่ทำงานโดยใช้กระบวนการเฝ้าระวัง
กระบวนการเฝ้าระวังเขียนด้วยภาษาไพธอนและเป็นพาเรนต์ และมีฟังก์ชันชื่อ start_child(name) ซึ่งใช้ subprocess.Popen เพื่อเปิดกระบวนการลูก ออบเจ็กต์ Popen จะถูกบันทึกเพื่อให้ผู้เฝ้าระวังสามารถตรวจสอบกระบวนการโดยใช้ poll() และท้ายที่สุดจะสิ้นสุดด้วย terminate() เมื่อจำเป็น หากเด็กเสียชีวิตอย่างกะทันหัน สุนัขเฝ้าบ้านจะเรียก start_child(name) อีกครั้งและบันทึกวัตถุ Popen ใหม่
มีกระบวนการย่อยทั้งหมด 7 กระบวนการ ซึ่งทั้งหมดเป็นกระบวนการแบบหลามเช่นกัน หากฉันเรียกใช้รายการย่อยด้วยตนเอง ฉันสามารถส่ง 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 ไปยังกระบวนการที่รีสตาร์ทซ้ำแล้วซ้ำเล่าได้ ทำไมพวกเขาถึงเพิกเฉยหลังจากรีสตาร์ทแล้ว?