2

我有一个小的 python 脚本,它创建了一个从 MySQL 中提取的数据图。我试图找出一种方法来定期在后台运行脚本。我尝试了很多事情:

  1. 运行脚本的 Cron 作业
  2. 循环计时器
  3. 使用 & 命令在后台运行脚本

这些都有优点和缺点:

  1. 每半小时运行一次的 Cron 作业似乎消耗了更多的资源,这是值得的。
  2. 放入脚本的循环计时器实际上并没有将脚本放在后台,它只是保持它运行。
  3. Linux & 命令使进程后台运行,但与真正的 Linux 服务不同,我无法在不杀死它的情况下重新启动/停止它。

有人可以指出一种方法来充分利用所有这些方法吗?

4

2 回答 2

11

你为什么不试着把你的脚本变成一个合适的守护进程。这个链接是一个很好的起点。

import os
import subprocess
import time
from daemon import runner

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        self.pidfile_path =  '/tmp/your-pid-name.pid'
        self.pidfile_timeout = 5
    def run(self):

        try:
            while True:

                ### PUT YOUR SCRIPT HERE ###

                time.sleep(300)

        except Exception, e:
            raise

app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

您可以像任何其他 linux 服务一样启动/停止/重新启动此脚本。

于 2012-06-07T01:00:01.050 回答
3

一般来说,cron 作业可能是一种很好的方法,因为 shell 方法需要手动干预才能启动它。

几个建议:

您可以使用锁定文件来确保 cron 作业仅启动 python 脚本的一个实例 - 将 cron 用于较大的作业时通常会出现问题,因为它在第一个实例实际完成之前启动了第二个实例。您可以简单地通过检查锁定文件是否存在来完成此操作,如果不存在,则在脚本开头“触摸”该文件并在脚本末尾将其作为您的最后一个操作“rm”。如果锁定文件存在——只需退出脚本,因为已经有一个实例在运行。(当然,如果脚本死了,您必须在再次运行脚本之前删除锁定文件)。

此外,如果过多的资源使用是一个问题,您可以通过给它一个低优先级(例如,nice -n 19 的前缀)来确保脚本不会占用太多资源。

于 2012-06-07T01:03:57.640 回答