工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

signalを受信する

概要

Pythonで、シグナル)を受信する方法を調べ、実装して動くか試した。


背景と目的

Pythonで、シグナル)を受信する必要が出たので、方法を調べ、実装して動くか試す。


詳細

1.Pythonの標準モジュール signal

Pythonには、はじめからシグナルを扱うためのモジュールsignalが標準で備わっている。調べたらすぐに出てきた。なので、ここを読んで試すことにする。


2.実装

今回、試すのは、

  • SIGTERM

linuxでいうところのkillコマンドで、プロセスを終了させられたとき

  • SIGINT

端末で、CTRL + Cキー を押されたとき

マニュアルを参考に、以下のようなコードを実装。

import signal
import time

flag = True

def sigterm_handler(signum, frame):
    print("sigterm_handler", signum, frame)
    global flag
    flag = False

def sigint_handler(signum, frame):
    print("sigint_handler", signum, frame)
    global flag
    flag = False

signal.signal(signal.SIGTERM, sigterm_handler)
signal.signal(signal.SIGINT, sigint_handler)

while flag:
    time.sleep(1)


3.動作確認

まず、CTRL + Cキーを押してみたところ、以下のようになった。SIGINTというシグナルを受信して、sigint_handler関数が呼ばれ、プログラムが終了したことがわかる。

^Csigint_handler 2 <frame at 0xb6a11c30, file 'signal_test.py', line 25, code <module>>

次に、killコマンドを実行し、プロセスを終了させてみたところ、SIGTERMというシグナルを受信して、sigterm_handler関数が呼ばれ、プログラムが終了したことがわかる。

sigterm_handler 15 <frame at 0xb69f3c30, file 'signal_test.py', line 25, code <module>>

ということで、正しく動作した。


まとめと今後の課題

Pythonで、シグナル)を受信する方法がわかった。