gpt4 book ai didi

Python - 在后台运行的无限循环脚本+重启

转载 作者:太空狗 更新时间:2023-10-30 03:00:11 29 4
gpt4 key购买 nike

我想要一个在后台运行的 python 脚本(无限循环)。

def main():
# inizialize and start threads
[...]

try:
while True:
time.sleep(1)

except KeyboardInterrupt:
my.cleanup()

if __name__ == '__main__':
main()
my.cleanup()
  1. 为了让应用程序在无限循环中不断运行,最好的方法是什么?我想删除不需要的 time.sleep(1)

  2. 我想在后台运行脚本 nohup python myscript.py & 有没有办法“优雅地”杀死它?当我正常运行它时按 CTRL+C my.cleanup() 被调用,有没有办法在使用 kill 命令时调用它?

  3. 如果我想(使用 cron)终止脚本并重新启动它怎么办?有没有办法让它执行 my.cleanup()

谢谢

最佳答案

  1. In order to have the application run constantly in infinite loop what is the best way? I want to remove the time.sleep(1) which I don't need

A while Truewhile <condition>在我看来,循环是可以的。

A sleep()只要您不要求您的程序等待特定时间段,对于这样的无限循环就不是强制性的。

  1. I would like to run the script in background nohup python myscript.py & is there a way to kill it "gracefully"? When I run it normally hitting the CTRL+C my.cleanup() is called, is there a way to call this when the kill command is used?

您可能希望使用 signal() 来“收听”多个信号包“signal”中的方法。

信号 Hook 扩展的简化示例:

import time
import signal

# determines if the loop is running
running = True

def cleanup():
print "Cleaning up ..."

def main():
global running

# add a hook for TERM (15) and INT (2)
signal.signal(signal.SIGTERM, _handle_signal)
signal.signal(signal.SIGINT, _handle_signal)

# is True by default - will be set False on signal
while running:
time.sleep(1)

# when receiving a signal ...
def _handle_signal(signal, frame):
global running

# mark the loop stopped
running = False
# cleanup
cleanup()

if __name__ == '__main__':
main()

请注意,您不能收听 SIGKILL ,当使用该信号终止程序时,您没有机会进行任何清理。您的程序应该意识到这一点(做一种启动前清理或失败并显示适当的消息)。

请注意,我使用全局变量来简化此示例,我更愿意将其封装在自定义类中。

  1. What if I would like (using cron) kill the script and restart it again? Is there a way to make it do my.cleanup()?

只要你的 cronjob 会用除 SIGKILL 以外的任何信号终止程序这当然是可能的。

你应该考虑以不同的方式做你想做的事情:例如,如果你想在无限循环任务之前“重新做”一些设置任务,你也可以在某个信号(一些程序例如,使用 SIGHUP 重新加载配置)。您必须打破循环,执行任务并恢复它。

关于Python - 在后台运行的无限循环脚本+重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276432/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com