[解決済み】SIGTERMシグナルを優雅に処理する方法は?
2022-04-02 16:54:47
質問
pythonで書かれたこのような些細なデーモンがあると仮定します。
def mainloop():
while True:
# 1. do
# 2. some
# 3. important
# 4. job
# 5. sleep
mainloop()
でデーモン化し
start-stop-daemon
を送信し、デフォルトでは
SIGTERM
(
TERM
) 信号を
--stop
.
現在実行されているステップを次のように考えてみましょう。
#2
. そして今この瞬間、私たちは
TERM
シグナルを送信します。
何が起こるかというと、実行が即座に終了してしまうのです。
シグナルイベントの処理は
signal.signal(signal.SIGTERM, handler)
が、やはり現在の実行を中断して、制御を
handler
.
そこで質問なのですが、現在の実行を中断せずに
TERM
を設定できるように、分離したスレッド(?
shutdown_flag = True
そのため
mainloop()
は、潔くやめる機会があったのでしょうか?
解決方法は?
クラスベースのクリーンなソリューションです。
import signal
import time
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self, *args):
self.kill_now = True
if __name__ == '__main__':
killer = GracefulKiller()
while not killer.kill_now:
time.sleep(1)
print("doing something in a loop ...")
print("End of the program. I was killed gracefully :)")
関連
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Python LeNetネットワークの説明とpytorchでの実装
-
[解決済み】RuntimeWarning: invalid value encountered in double_scalars で numpy の除算ができない。
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】 AttributeError("'str' object has no attribute 'read'")
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] PythonでSIGINTを捕捉するには?