【问题标题】:Using cron job to check if python script is running使用 cron 作业检查 python 脚本是否正在运行
【发布时间】:2012-02-10 05:56:05
【问题描述】:

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

我有如下代码:

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')

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

【问题讨论】:

  • 我会在一个简单的 shell 脚本中执行此操作。使用命令末尾的&amp; 字符在后台运行它。

标签: python cron


【解决方案1】:

我喜欢使用类似于以下的 shell 脚本来执行此操作。它很简单,出错的可能性很小。一般来说,我把它放在一个 while 循环中,最后是 sleep,但 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 退出代码,而是 os.kill 抛出 OSError 异常,您可以在 try - catch 块中处理这些异常。同样的原则也适用于使用信号 0 来检测进程是否存在,但是您的进程已经死亡并且另一个进程现在具有相同的 pid 的可能性很小,所以请在您的 try - catch 中处理这种情况.

【讨论】:

    【解决方案2】:

    我认为最好让网络服务器将其进程 ID 写入文件,然后让 cron 作业读取该文件并检查进程是否正在运行。

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

    【讨论】:

      【解决方案3】:

      您可以通过在后台启动应用程序并使其免受挂断信号的影响来实现。

      尝试将系统命令更改为:

      nohup python webserver.py &
      

      【讨论】:

        猜你喜欢
        • 2015-02-22
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 2019-03-10
        • 2010-10-21
        相关资源
        最近更新 更多