我很好奇如何在后台运行一个Python脚本,每60秒重复一次任务。我知道可以使用&将某些东西放到后台,对于这种情况是否有效?
我考虑使用循环,让它等待60秒并重新加载,但是感觉不太对劲。
&
将进程放在后台,并且使用nohup
使进程在退出终端时不被杀死。相反,这将在运行程序时自动分离终端。import daemon
import time
def do_something():
while True:
with open("/tmp/current_time.txt", "w") as f:
f.write("The time is now " + time.ctime())
time.sleep(5)
def run():
with daemon.DaemonContext():
do_something()
if __name__ == "__main__":
run()
实际运行它的方式是:
python background_test.py
注意这里没有&
。
此外,另一个stackoverflow答案详细解释了使用python-daemon的许多好处。
我认为你的想法几乎完全符合你的要求。例如:
import time
def do_something():
with open("/tmp/current_time.txt", "w") as f:
f.write("The time is now " + time.ctime())
def run():
while True:
time.sleep(60)
do_something()
if __name__ == "__main__":
run()
调用time.sleep(60)
将使您的程序休眠60秒。当时间到达时,操作系统将唤醒您的程序并运行do_something()
函数,然后将其放回休眠状态。在程序休眠期间,它不能高效地执行任何任务,这是编写后台服务的通用模式。
要从命令行实际运行此程序,可以使用&:
$ python background_test.py &
执行此命令时,脚本的任何输出都将发送到启动该脚本的终端。您可以通过重定向输出来避免这种情况:
$ python background_test.py >stdout.txt 2>stderr.txt &
nohup python background_test.py
),假设你希望守护进程在你退出登录后继续运行。 - Foon在shell中使用&可能是Greg所描述的最简单的方法。
如果您真的想要创建一个强大的守护进程,您将需要研究os.fork()命令。
来自维基百科的示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, time
def createDaemon():
"""
This function create a service/Daemon that will execute a det. task
"""
try:
# Store the Fork PID
pid = os.fork()
if pid > 0:
print 'PID: %d' % pid
os._exit(0)
except OSError, error:
print 'Unable to fork. Error: %d (%s)' % (error.errno, error.strerror)
os._exit(1)
doTask()
def doTask():
"""
This function create a task that will be a daemon
"""
# Open the file in write mode
file = open('/tmp/tarefa.log', 'w')
# Start the write
while True:
print >> file, time.ctime()
file.flush()
time.sleep(2)
# Close the file
file.close()
if __name__ == '__main__':
# Create the Daemon
createDaemon()
然后你可以在 doTask()
块内放置任何所需的任务。
您无需使用 & 启动此任务,这将允许您进一步自定义执行方式。