2010-04-26 168 views
5

这篇文章介绍了如何保持一个子进程活着bash脚本:如何在失败时自动重启python脚本?

How do I write a bash script to restart a process if it dies?

这调用另一个bash脚本伟大的工作。

不过,我想执行类似的东西在那里子进程是一个Python脚本,daemon.py它创建它在后台运行一个派生的子过程:

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

现在的行为是完全不同的。看起来python脚本不再是bash脚本的子代,但似乎已经'接管'了BASH脚本PID - 所以不再有BASH包装器绕过被调用的脚本...为什么?

+3

这将有助于了解daemon.py中的内容,但是从名称来看,我猜测它执行的是“exec”或任何python等价物将其置于后台。 – 2010-04-26 15:08:13

+0

...... W时的T? – 2010-04-26 15:08:42

+0

编辑描述daemon.py – chris 2010-04-26 15:15:24

回答

5

守护进程双重叉,作为守护进程本身的关键点 - 所以父进程拥有的PID没有任何价值(它在子进程启动后很快消失)。

因此,守护进程应该将自己的PID写入“知名位置”的文件中,按照惯例,父进程知道从哪里读取;使用这种(传统的)方法,如果父进程想要​​作为重启看门狗,可以简单地从知名位置读取守护进程的PID,并定期检查守护进程是否仍然存在,并在需要时重启它。当然,(一个“陈旧”的PID会停留在“知名位置”文件中一段时间​​,并且父代必须考虑这一点),并且可能会有变种(守护进程可以发出“心跳”,以便父母不仅可以检测死亡守护进程,还可以检测出“永久停滞”的死亡守护进程,例如由于死锁,因为他们停止发送“心跳”[[通过UDP广播等] ] - 等等),但这是一般的想法。

0

看来,这种行为是完全不同的,因为这里你的“daemon.py”作为守护进程在后台启动。

在另一个指向被调查进程的链接是而不是守护进程,它不会在后台启动。发射器只是永远等待子进程停止。

有几种方法可以解决这个问题。经典的是@Alex解释的方式,在传统的地方使用一些pid文件。

另一种方式可能是建立看门狗运行中的进程内,守护进程监视......这将模拟一个正确的过程,不要随意(这是不应该发生的)打破...

3

你应该看看Python增强建议3143(PEP)here。在这本书中,建议在Python标准库中包含一个守护进程库。他浏览了很多关于守护进程的很好的信息,并且非常容易阅读。参考实施是here

+0

感谢参考保罗。看起来很有用。 – chris 2010-04-26 16:54:46

-1

利用'https://github.com/ut0mt8/simple-ha'。

简单公顷

累的keepalived,corosync,心脏起搏器,心跳或什么的?这里有一个简单的守护进程,它可以确保两台主机之间的心跳。一个是活动的,另一个是备份,在更改状态时启动脚本。简单的实施,KISS。生产准备好了(至少它适用于我:)

生活会太容易了!

+1

虽然这可能在理论上回答这个问题,但[这将是更可取的](// meta.stackoverflow.com/q/8259)在此包含答案的基本部分,并提供供参考的链接。 – 2016-11-12 07:09:46

+0

谢谢指出。我会尽力更新这个尽快。 – 2016-11-12 08:30:03