ウェブサイト検索

BashとPythonでSIGTERMを送信し捕まえる方法


Linuxでは、プロセスはシグナルを使用して互いに通信します。シグナルはソフトウェアの割り込みとして機能し、プログラムにさまざまなイベントや要求を通知します。たとえば、プログラムが実行中のときに、プログラムを終了させるためにkillシグナルを送信することができます。送信されたシグナルは、実行の停止、プログラムの終了、実行の再開など、さまざまなアクションを引き起こすことがあります。

Bash と Python を使用しているとき、実行中のプロセスを穏やかに終了させるために SIGTERM シグナルを送ることができます。この投稿では、Bash と Python での SIGTERM の送信およびキャッチについて説明します。

SIGTERMとは何ですか

Unixシステムには、システム、デバイス、ユーザー定義信号の3つのカテゴリの信号があります。各信号には整数値があります。信号は、その名前または整数値を指定することで実行できます。

SIGTERMは整数値15の信号です。これは、実行中のプロセスを穏やかに終了したいときに実行されます。以下は、BashでSIGTERMを使用するための構文です。

kill -SIGTERM <PID>

or

kill -15 <PID>

次のコマンドを使用して、利用可能なすべての信号を確認できます:

kill -l

bashとPythonでSIGTERMを送信し、受信する方法

BashとPythonで異なるインスタンスでSIGTERMを送信および受信することを検討するかもしれません。BashまたはPythonプログラムを実行すると、プログラムを終了させるためにSIGTERM信号を発行できます。BashとPythonでSIGTERMを送信および受信する方法を理解するためのさまざまな例があります。

1. Pythonスクリプトを使用する

Python 1.4および最新バージョンを使用する場合、signalライブラリを利用してSIGTERMを送信および受信することができます。プログラムにライブラリをインポートして、プログラムが異なるシグナルを取得し、反応する方法を定義します。signalライブラリを使用すると、受信したシグナルの整数を報告するシグナルハンドラを作成できます。その後、捕捉したシグナルを登録し、プロセスID(PID)などの現在のプロセスに関する情報を取得できます。例を挙げてみましょう。

私たちは送信された信号の整数をキャッチするPythonスクリプトを持っています。さらに、現在のプロセスのPIDもキャッチします。

次の画像では、Pythonスクリプトを実行し、数秒ごとに実行されるwhileループを持っています。別の端末では、Pythonスクリプトを実行して得られたPIDを指定することにより、プロセスを終了するためにSIGTERM信号を送ることができます:

SIGTERMシグナルを送信すると、スクリプトの実行が停止することに気付きます。それは、シグナルの整数値をキャプチャするからです。この場合、SIGTERMシグナルにはkill -15を実行します。また、SIGTERMの整数値の代わりにSIGTERMキーワードを使用してSIGTERMキルシグナルを送信することもできます。同じ結果が得られます。

次の構文を使用して、Pythonのジョブを実行することもできます:

python3 <script/job> &

最初の方法とは異なり、このオプションを使用してSIGTERMを送信すると、ジョブが実行を開始した時にジョブIDが印刷されることがわかります。それを終了すると、「完了」というステータスが得られます。SIGTERMは、その名前または整数を指定することで送信できます。

2. Bashスクリプトを使用する

Bashスクリプトを実行する際に信号をキャッチするために「trap」コマンドを使用できます。この例では、SIGTERM信号をキャッチするために「trap」コマンドを追加しました。このスクリプトは、SIGTERM信号が送信されない場合に「date」コマンドを千回実行する「for」ループです。

Bashスクリプトを実行しているとき、Ctrl + Zのキーボードキーを押すことでSIGTERM信号を送ることができます。「trap」コマンドは送信された信号をキャッチし、「for」ループは実行を停止します。実行中のジョブがSIGTERM信号を受信し、停止したことを確認する出力が得られます。

それがBashでSIGTERMを送信し、受け取る方法です。

結論

ジョブやプログラムを実行する際に、異なる目標を達成するために異なるシグナルを送信できます。SIGTERMはプログラムを優雅に停止させるために送信されます。Pythonでは、シグナルをキャッチするためにシグナルハンドラーが必要で、“kill”コマンドを使ってSIGTERMを送信することができます。また、Bashで“trap”コマンドやキーボードキーを使用してSIGTERMシグナルをキャッチして送信することができます。この記事では、これを達成する方法についてのさまざまな例を詳細に紹介しました。