簡體   English   中英

Python - 在后台運行的無限循環腳本+重啟

[英]Python - Infinite loop script running in background + restart

我想有一個在后台運行的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 &有沒有辦法“優雅地”殺死它? 當我運行它時,通常my.cleanup() CTRL + C my.cleanup() ,有沒有辦法在使用kill命令時調用它?

  3. 如果我想(使用cron)殺死腳本並重新啟動它會怎么樣? 有沒有辦法讓它做my.cleanup()

謝謝

  1. 為了讓應用程序在無限循環中持續運行,最好的方法是什么? 我想刪除我不需要的time.sleep(1)

在我看來, while True或者while <condition>循環是好的。

只要您不需要程序等待一段時間, sleep()就不是必需的。

  1. 我想在后台運行腳本nohup python myscript.py&有沒有辦法“優雅地”殺死它? 當我運行它時,通常按下CTRL + C調用my.cleanup(),有沒有辦法在使用kill命令時調用它?

您可能希望使用“ signal ”包中的signal()方法“監聽”多個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 ,在使用該信號終止程序時,您沒有機會進行任何清理。 你的程序應該意識到這一點(做一個預啟動清理或失敗的正確消息)。

注意,我使用全局變量來保持這個示例簡單,我更喜歡將它封裝在自定義類中。

  1. 如果我想(使用cron)殺死腳本並重新啟動它會怎么樣? 有沒有辦法讓它做my.cleanup()?

當然,只要你的cronjob會用除SIGKILL之外的任何信號殺死程序,這是可能的。

您應該考慮以不同的方式執行您想要執行的操作:例如,如果您想在無限循環任務之前“重新執行”某些設置任務,您也可以在某個信號上執行此操作(某些程序使用SIGHUP執行此操作)例如,重新加載配置。 你必須打破循環,完成任務並恢復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM