2012-06-07 52 views
2

我有一个小型的python脚本,可以创建从MySQL中提取的数据图。我试图找出一种定期在后台运行脚本的方法。我已经尝试了一些事情:如何在计划的后台运行我的python脚本?

  1. 一个cron作业运行该脚本
  2. 一个循环计时器
  3. 使用&命令在后台运行脚本

这些都有没有优势和缺点:

  1. 运行更多然后每半小时的Cron作业似乎吃掉了更多的资源,然后这是值得的。
  2. 放入脚本的循环计时器实际上并不把脚本放在后台,它只是保持运行。
  3. Linux &命令背景的过程,但不像一个真正的Linux服务,我不能重新启动/停止它不杀死它。

有人可以指点我一种方法来获得所有这些方法中的最佳方法吗?

+1

#1没有任何意义。什么资源?从cron运行不会让你的应用程序比平时消耗更多的资源。 –

+0

我需要每分钟运行一次脚本,并且cron在运行时似乎会突然激增,而每分钟左右的这些峰值似乎会减慢速度。 cron也不会在脚本运行后离开任务列表,所以每次运行时都会使用越来越多的内存。 – user1441079

+0

不是侮辱,但你可能做错了或解释一些数据错误 - 你可以请你发布你正在做的和看到的细节(cron行,ps输出,让你觉得它是spiking等)? Cron已经存在了很长时间,并且非常稳定,看来cron *本身*不太可能引发问题。而且cron应该总是保持顺畅运行 - 这就是它可以在任意时间开始工作的方式。 –

回答

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

3

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

一对夫妇的建议:

你可以使用一个锁文件,以确保cron作业永远只能启动python脚本的一个实例 - 如何使用cron较大的任务时,经常会出现问题,因为它启动的第二个实例在第一次实际完成之前。您可以简单地通过检查锁定文件是否存在来做到这一点,然后,如果不存在,请在脚本开始处“触摸”文件,并将其作为脚本末尾的最后一个操作。如果锁定文件存在 - 只需退出脚本,因为已经有一个实例在运行。 (当然,如果脚本死了,你必须在再次运行脚本之前删除锁定文件)。另外,如果过度使用资源是一个问题,您可以通过将脚本赋予低优先级(例如nice -n 19的前缀)来确保该脚本不会占用太多资源。

+0

酷我会试一试 – user1441079

+0

正如你所说的那样,cron的工作总体来说还不错,但是现在的操作系统表示它必须每分钟运行一次,这意味着大部分时间这项工作都需要记忆。所以我会采取守护进程的方法。尽管每分钟从MySQL中获取数据听起来都不正确。 –

+1

是的,我同意如果必须每分钟运行一次守护进程就值得追求。然而,OP所描述的症状(每次运行时都会使用更多的内存等)似乎表明,虽然间接地说脚本需要花费相当多的时间才能完成。可能需要对其进行基准测试并找出瓶颈所在,然后找出可能需要执行时间/资源的实际时间表。 – Soz

相关问题