我想要一个在后台运行的python脚本(无限循环)。
def main():
# inizialize and start threads
[...]
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
my.cleanup()
if __name__ == '__main__':
main()
my.cleanup()
为了让应用程序在无限循环中持续运行,最好的方法是什么?我想删除我不需要的time.sleep(1)
我想在后台运行脚本nohup python myscript.py &
有没有办法可以“优雅地”杀死它?当我运行它时通常会调用CTRL + C my.cleanup()
,有没有办法在使用kill命令时调用它?
如果我想(使用cron)杀死脚本并重新启动它怎么办?有没有办法让它my.cleanup()
?
谢谢
答案 0 :(得分:4)
- 为了让应用程序在无限循环中持续运行,最好的方法是什么?我想删除我不需要的time.sleep(1)
醇>
在我看来,while True
或while <condition>
循环正常。
只要您不要求程序等待一段时间,sleep()
就不是必需的。
- 我想在后台运行脚本nohup python myscript.py&amp;有没有办法杀死它&#34;优雅&#34;?当我运行它时,通常按下CTRL + C调用my.cleanup(),有没有办法在使用kill命令时调用它?
醇>
你可能希望&#34;听&#34;使用来自包&#34; signal()
&#34;的signal
方法来发送几个信号。
信号挂钩扩展的简化示例:
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
,在使用该信号终止程序时,您无法进行任何清理。你的程序应该意识到这一点(做一个预启动清理或失败的正确消息)。
注意,我使用全局变量来保持这个示例简单,我更喜欢将它封装在自定义类中。
- 如果我想(使用cron)杀死脚本并重新启动它怎么办?有没有办法让它做my.cleanup()?
醇>
只要您的cronjob会使用除SIGKILL
之外的任何信号来杀死该程序,当然这是可能的。
你应该考虑以不同的方式做你想做的事情:例如,如果你想做&#34;重做&#34;在无限循环任务之前的一些设置任务,您也可以在某个信号上执行此操作(例如,某些程序使用SIGHUP
来重新加载配置)。你必须打破循环,完成任务并恢复它。