2012-02-10 48 views
1

我目前有一个Python web服务器应用程序正在运行,我想为cron作业使用python脚本来检查应用程序是否正在运行,否则启动应用程序。使用cron作业来检查python脚本是否正在运行

我有如下下面的代码:

import os 

string = os.popen('ps aux') 
n = 0 
for line in string.readlines(): 
    if "python webserver.py" in line: 
    n+=1 
if n < 1: 
    os.system('python webserver.py') 

现在脚本执行的应用程序。但我想要的是让脚本启动应用程序并退出,让应用程序继续运行。有什么办法可以这样做吗?提前致谢。

+0

我会在一个简单的shell脚本中执行此操作。使用命令末尾的'&'字符在后台运行它。 – wim 2012-02-10 06:00:04

回答

1

我喜欢类似于以下一个shell脚本来做到这一点。它很简单,错误的可能性很小。一般来说,我把它放在最后睡眠的while循环中,但是cron也可以正常工作。

if [ -x myproc.pid ] ; then 
    pid=`cat myproc.pid` 
else 
    pid=1 
fi 
kill -0 $pid #check if process is still running 

正如您所看到的,它需要您的进程在启动时将其PID写入文件。这避免了ps输出的问题,因为获得一个正则表达式可能会非常棘手,因为无论将来有什么新的进程名称出现在您的服务器上,它都可以正常工作。 PID文件是确定的。

kill -0是一种鲜为人知的方式,用于检查进程是否正在运行并且比检查/proc中的目录更简单。 pid=1这一行在那里,因为检查器不是root用户,因此如果你不能发送信号给进程,kill检查将总是失败。那是第一次在这台服务器上运行myproc。请注意,这意味着检查脚本不能作为root(通常是良好实践)运行,但必须以运行正在检查的进程的相同用户身份运行。

如果你真的想在Python中做到这一点,那么os模块可以访问PID并有kill方法。但它不返回shell的退出码,而是os.kill抛出OSError异常,您可以在try - catch块中处理这些异常。同样的原则适用于使用信号0来检测过程是否存在,但是您的过程已经死亡的机会很小,而另一个过程现在具有相同的PID,因此请在try - catch中处理该情况。

2

我认为如果你让你的web服务器把它的进程ID写入一个文件然后让你的cron作业读取并检查这个进程是否正在运行会更好。

使用某种进行管理的框架(例如supervisord,upstart等)而不是使用os.system手动启动框架也是有用的。

0

你可以通过在后台启动应用程序来做到这一点,并可能使它免疫挂断信号。

尝试更改系统命令:

nohup python webserver.py & 
相关问题