高效的Python守护进程

高效的Python守护进程,python,daemon,Python,Daemon,我很好奇如何在后台运行python脚本,每60秒重复一次任务。我知道你可以在后台用&,这对这个案子有效吗 我想做一个循环,让它等60秒再加载,但感觉有些不对劲。我想你的想法正是你想要的。例如: import time def do_something(): with open("/tmp/current_time.txt", "w") as f: f.write("The time is now " + time.ctime()) def run(): whi

我很好奇如何在后台运行python脚本,每60秒重复一次任务。我知道你可以在后台用&,这对这个案子有效吗


我想做一个循环,让它等60秒再加载,但感觉有些不对劲。

我想你的想法正是你想要的。例如:

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()
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()
调用
time.sleep(60)
将使程序休眠60秒。当时间到了,操作系统会唤醒你的程序并运行
dou\u something()
函数,然后让它回到睡眠状态。当您的程序处于睡眠状态时,它没有非常有效地执行任何操作。这是编写后台服务的一般模式

要从命令行实际运行,可以使用&:

$ python background_test.py &
执行此操作时,脚本的任何输出都将转到与启动脚本的终端相同的终端。您可以重定向输出以避免这种情况:

$ python background_test.py >stdout.txt 2>stderr.txt &

在shell中使用&可能是Greg描述的最简单的方法

但是,如果您确实想创建一个功能强大的守护进程,则需要查看os.fork()命令

示例来自:

然后,您可以将所需的任何任务放入
doTask()
块中


您不需要使用&来启动它,它将允许您进一步自定义执行。

与其编写自己的守护进程,不如使用!实现“标准守护进程进程库”的行为良好的守护进程规范

我已经包含了基于这个问题的公认答案的示例代码,尽管代码看起来几乎相同,但它有一个重要的基本区别。如果没有,您将不得不使用
&
将您的进程置于后台和
nohup
,并在退出shell时防止进程被杀死。相反,当您运行程序时,它将自动从终端分离

例如:

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()
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
注意这里没有


此外,还详细说明了使用的许多好处。

这取决于您想要什么。如果你想安排一个任务每隔一段时间重复一次,看看cron。谢谢,伙计,这正是我想要的。我所知道的编程的点点滴滴都来自Javascript,试图在计时器上做任何事情都变成了一场噩梦!您可能还想看看nohup(例如,
nohup-python-background_-test.py
),假设您希望守护程序在您注销后继续运行)使用“标准守护程序进程库”
python-daemon
有一种更简单的方法可以做到这一点:@user2452250:请查看您可能会感到惊讶的问题,但政治公众人物和图书馆的作者是同一个人。所以,是的,图书馆很好地实现了PEP:)你们说“这是另一个答案”,但链接到一个问题,而不是答案。您链接到的问题的选定答案(在发表此评论时)未使用python守护进程。也许你的意思是?