常駐プロセスでシグナルを受けて安全に停止する実装
シグナルを考慮した無限ループの実装の必要があったためメモ コード
code:sig.py
import signal
import time
from logging import getLogger, StreamHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
handler.setLevel(DEBUG)
logger.setLevel(DEBUG)
logger.addHandler(handler)
logger.propagate = False
def main():
logger.info("start main function")
global running
running = True
loop_count = 1
while running:
logger.info("start: {0}".format(loop_count))
time.sleep(3)
logger.info("end: {0}".format(loop_count))
loop_count += 1
logger.info("end main function")
def stop_loop(signum, frame):
logger.info("{0}, {1}".format(signum, frame))
global running
running = False
if __name__ == '__main__':
signal.signal(signal.SIGTERM, stop_loop)
signal.signal(signal.SIGINT, stop_loop)
main()
無限ループを main 関数で実施
シグナルを受けると stop_loop が起動し、グローバル変数 running を False にする
main 関数では running を見ているため、Falseにされるとループを抜けて停止する
動作確認
実際に動作させてみた時のキャプチャが以下
上でプログラムを動作させて、下でSIGTERMを送信している
https://gyazo.com/7638c36bc8d01efef88436220c83cc39
きちんとループの最後の処理が呼び出されている
main関数の最後の出力もされている