У меня есть несколько исполняемых двоичных файлов C ++, которые мне нужно запустить из скрипта Python. В зависимости от состояния этих исполняемых файлов, сценарий будет делать некоторые вещи. Допустим, я запускаю 4 отдельные программы, и все они работают. Мой сценарий должен убедиться в том, что эти 4 программы работают без сбоев. Если это так, скрипт отправит электронное письмо с информацией в строках «Процесс XYZ не выполнен в это время»
Я на машине с Linux. Я пробовал разные комбинации трюков с подпроцессами, но не играл в кости. Я полагаю, что мне может понадобиться использовать многопоточность и сохранять «сторож» в процессах, которые он начал. В идеале скрипт должен запускать эти программы в отдельных окнах терминала, так что всего 4 окна терминала.
Ниже моя попытка:
import subprocess as sp
clear = sp.call('clear')
try:
comm = sp.Popen(['xterm', '-e', '~/stuff/comm'])
while sp.Pipe == -1:
...do stuff
except sp.PIPE == -2:
...send email.
Проблема с вышеуказанным подходом заключалась в том, что, если я убиваю программу, сценарий запущен, сценарий не осознает, что он был уничтожен.
Ааа, мозг зажарен, я постараюсь добавить более понятную информацию позже, но если кто-то уже знает, чего я пытаюсь достичь, я буду очень признателен.
Поскольку вы работаете на компьютере с Linux, вы можете использовать сигналы, в частности, SIGCHLD. Этот сигнал отправляется родительскому процессу, когда умирает любой из его дочерних процессов. Действие по умолчанию — игнорировать его, поэтому вам нужно установить обработчик для его обработки:
import os
import signal
def sigchld(sig, frame):
(pid, r) = os.wait()
print pid, "exited with", ("signal %d" % (r & 0x7f) if os.WIFSIGNALED(r) else "exit code %d" % (r >> 8))
signal.signal(signal.SIGCHLD, sigchld)
# run your subprocesses here