我目前正在运行一个Python webserver应用程序,我想使用cthon作业的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 :(得分:2)
我认为如果你让你的web服务器将其进程id写入文件然后让你的cron作业读取并检查进程是否正在运行会更好。
使用某种进行过程管理的框架(例如supervisord,upstart等)而不是使用os.system
手动启动它也是有用的。
答案 1 :(得分: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写入文件。这避免了grepping ps输出的问题,因为无论将来什么新的进程名称进入您的服务器,获得一个始终有效的正则表达式可能会很棘手。 PID文件确定无疑。
kill -0
是一种鲜为人知的方法,用于检查进程是否正在运行,并且比检查/proc
中的目录更简单。 pid=1
的行是因为检查器不是root,因此如果无法向进程发送信号,则kill检查将始终失败。这是第一次在此服务器上运行myproc。请注意,这意味着检查脚本不能以root
运行(通常是良好实践),但必须以运行您正在检查的流程的同一用户身份运行。
如果您真的想在Python中执行此操作,则os
模块可以访问PID并具有kill
方法。但是,它不返回shell exitcode,而是os.kill
抛出OSError
个例外,您可以在try
- catch
块中处理这些异常。同样的原则适用于使用信号0来检测流程是否存在但是您的流程很可能已经死亡而另一个流程现在具有相同的pid,因此请在try
中处理该情况 - { {1}}。
答案 2 :(得分:0)
您可以通过在后台启动应用程序并可能使其免于挂断信号来实现。
尝试将系统命令更改为:
nohup python webserver.py &