Я пытаюсь использовать asyncio.create_subprocess_exec
для запуска долго выполняющегося процесса (вроде демона).
Однако я не могу дождаться, чтобы узнать, был ли процесс успешным / неудачным. Я должен асинхронно определить, произошел ли сбой процесса, и обработать его в этот момент. В противном случае я оставляю демон подпроцесса включенным и связываюсь с ним по TCP / IP.
Я мог бы использовать обработчик сигнала в SIGCHLD, но есть ли в asyncio встроенные функции для создания обработчика для подпроцесса?
import asyncio
import subprocess
async def main():
command = ["./some-long-running-daemon"]
process = await asyncio.create_subprocess_exec(*command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(process.returncode) # this is None
if __name__ == "__main__":
asyncio.run(main())
Я обнаружил, что асинхронный подпроцесс c create, похоже, не совсем хорошо работает с SIGCHILD
(обработчик даже не запускается). В то время как subprocess.Popen
делает. У Popen
также есть метод poll()
, тогда как у подпроцесса asyn c нет. Кажется, Popen
- это то, что нужно.