Python程序作为子级管理Python脚本

2024-10-01 02:20:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一个类似于以下内容的python:

until python program.py; do 
    echo "Crashed...Restarting..." >&2
    sleep 1
done

还有,我要杀人程序.py当父程序被终止时。有什么建议吗?你知道吗


Tags: pyecho程序sleepprogramdo建议until
3条回答
#!/usr/bin/python

import os
import signal
import subprocess
import sys
import time

Proc = None

def signal_handler(sig, frame):
   ''' Kill the program '''
   os.kill(Proc.pid, sig)
   sys.exit(0)

def main():
   global Proc
   ''' Handle signal on parent program ''' 
   signal.signal(signal.SIGTERM, signal_handler)
   signal.signal(signal.SIGINT, signal_handler)

   Proc = subprocess.Popen(['python', 'program.py'], 
                          stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   while True:
        try:
           wait = Proc.wait()
           if wait:
                if wait != (-1 * signal.SIGKILL):
                    print "Restarting ....(return code %d)" % wait
                    time.sleep(1)
                    Proc = subprocess.Popen(['python', 'program.py'], 
                                            stdout=subprocess.PIPE,  
                                            stderr=subprocess.PIPE)
                else:
                   ''' kill yourself '''
                   sys.exit(0)
        except KeyboardInterrupt:
            # If python >= 2.6 
            # Proc.kill()
            sys.exit(0)

if __name__ == '__main__':
    main()

如果您可以更改program.py,我会修改它,以便您可以直接调用它,而不是在子进程中调用它。如果您的程序遵循只包含定义的约定,并且只在直接调用时才执行最终可执行部分,即

def do_something():
  pass

def do_something_else():
  pass

if __name__ == '__main__':
  do_something()
  do_something_else()

在函数中包装最后一个块就足够了,例如

def main():
  do_something()
  do_something_else()

if __name__ == '__main__':
  main()

此时,只需导入program.py模块并调用program.main(),代码就简单多了。你知道吗

模块subprocesspsutil应该提供您所需要的大部分(如果不是全部的话)。你知道吗

import sys, subprocess
while True :
    retCode= subprocess.call(["python","program.py"])
    if retCode == 0 : break
    print('Crashed...Restarting...', file=sys.stderr )

相关问题 更多 >