2017-03-06 76 views
1

我有一个在supervisor下运行的python脚本。如何重新启动脚本,如果它停止工作,但仍然显示为在监督员下运行

我选择了主管事业就会自动启动脚本时,机器启动起来,当脚本所谓的“死”

它的作用是执行后running.log每3-6秒它会不断写入日志文件一些行动。

如果有例外,它将写入异常到一个单独的日志文件。

脚本停止,尽管在此期间没有异常后5小时写running.log

它仍显示为下运行主管和有在它理应停止写入running.log的时候也不例外。

然而,它停止了成功,尽管这样做5个小时写running.log脚本。

我然后再手动重新启动下监督员的服务。

我有什么选择?

+0

首先想到的是:脚本中存在一些错误。你应该解决这个问题,确保脚本死亡......或者另一种选择是将一些“看门狗”机制放在其中(尽管我不会建议这样做)。 – MariusSiuram

+0

我不确定如何复制此错误,因为我可以在检测到此站点前数小时。我可以编写一个脚本,基本上每30秒检查一次'running.log'的大小,如果它无法更改,那么脚本会告诉主管重新启动服务? –

+0

这将是一个监督机制。请注意,该错误仍然存​​在,我建议(首先)尝试调试它 - 例如,一旦失败就将调试器附加到正在运行的进程。 – MariusSiuram

回答

1

我能想到的两个选项:

1.查找错误

脚本没有反应,但没有死。这意味着它已经陷入了僵局,或者陷入了无限循环,或者被锁定在某些I/O过程中或者其他什么地方。

我要说的是,发现的bug,并删除它是行动的伟大历程!您可以查看代码并感受可能发生的情况,添加一些日志详细程度或类似信息。或者你可以调试它。有一些机制可将调试器附加到正在运行的Python脚本中: https://wiki.python.org/moin/DebuggingWithGdb

您将需要权限才能执行此操作。如果它是一个生产代码,那么这是一个坏消息......但是在生产机器中有一个未检测到的未定义错误并不合适。那么也许你可以设置一些舞台机器并在那里调试脚本?这样你就可以找到问题所在。

2.添加一些看门狗机制

您可以添加一些进程来观察脚本。其实脚本本身可以把它变成东西来看日志文件的修改时间。骷髅(未经测试):

def watch(watch_path): 
    last_modified = <get modification time of watch_path> 
    while True: 
     <sleep> 
     if <check modification times>: 
      <kill> os.getppid() # kill parent process 
     else: 
      last_modified = <get modification time> 

... 

p = multiprocessing.Process(target=watch, args=(log_output_path,)) 
相关问题