定期重启程序

时间:2017-04-28 06:35:55

标签: python

我目前正在开展一个项目,我想重启并每10分钟重新运行一次。所以我创建了这个测试文件,看看能否让它运行起来。

import sys
import os
import sched
import time

print("Hello")
s = sched.scheduler(time.time, time.sleep)

def restart_program(sc):
    python = sys.executable
    os.execl(python, python, * sys.argv)
    s.enter(5, 1, restart_program, (sc,))

s.enter(5, 1, restart_program, (s,))
s.run()

所以我希望这个程序每5秒重启一次。在这种情况下,它会打印" Hello!"。但是当我运行它时,它只会打印一次而不会重新启动。

我如何定期重启?

2 个答案:

答案 0 :(得分:2)

我不知道你究竟在找什么,但以下是3种可能的情况。

1:如果程序正在运行(可能作为守护程序?)并且您希望在一段时间后继续调用特定方法,那么您可以使用apscheduler

from apscheduler.schedulers.blocking import BlockingScheduler

def do_something_every_5_second():
    print "Do something"

scheduler = BlockingScheduler()
scheduler.add_job(do_something_every_5_second, 'interval', seconds=5)
scheduler.start()

2:您可以使用Cron,它将在定义的时间执行您的python脚本。请注意,Cron不能设置不到1分钟。因此,例如,如果您想每5秒钟通过Cron运行脚本,那么您将不得不使用下面的黑客。

* * * * * /path/to/script
* * * * * sleep 5; /path/to/script
* * * * * sleep 10; /path/to/script
* * * * * sleep 15; /path/to/script
* * * * * sleep 20; /path/to/script
* * * * * sleep 25; /path/to/script
* * * * * sleep 30; /path/to/script
* * * * * sleep 35; /path/to/script
* * * * * sleep 40; /path/to/script
* * * * * sleep 45; /path/to/script
* * * * * sleep 50; /path/to/script
* * * * * sleep 55; /path/to/script

如果您使用的是Windows,则可以使用Windows任务计划程序。见Schedule Python Script - Windows 7

3:您可以使用带超时的循环(as suggested by Sneh

答案 1 :(得分:0)

除了一些更好选择的可能性之外,我认为由于os.execl的行为,您的代码无效:

  

这些函数都执行一个新程序,取代当前进程;他们不回来了。

结帐subprocess.Popen

   import sched
   import time
   import subprocess

   print("Hello")
   s = sched.scheduler(time.time, time.sleep)

   def restart_program(sc):
       subprocess.Popen(["echo", "external process is being called"])
       s.enter(5, 1, restart_program, (sc,))

   s.enter(5, 1, restart_program, (s,))
   s.run()