如何按计划在后台运行我的python脚本?

时间:2012-06-07 00:51:08

标签: python linux service

我有一个小的python脚本,可以创建从MySQL中提取的数据图。我正试图找出一种在后台运行脚本的方法。我尝试过很多东西:

  1. 运行脚本的Cron作业
  2. 循环计时器
  3. 使用&命令在后台运行脚本
  4. 这些都有优点和缺点:

    1. Cron Job每隔半小时运行一次,似乎耗费了更多的资源,然后才值得。
    2. 放入脚本的循环计时器实际上并没有将脚本放在后台,只是让它继续运行。
    3. Linux&命令背景这个过程,但与真正的Linux服务不同,我无法在不杀死它的情况下重新启动/停止它。
    4. 有人能指出我如何充分利用所有这些方法吗?

2 个答案:

答案 0 :(得分:11)

为什么不尝试将脚本变成正确的守护进程。这个link是一个很好的起点。

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服务一样启动/停止/重启此脚本。

答案 1 :(得分:3)

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

一些建议:

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

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