組み込み開発のためのPython · レッスン 220 / 220

長時間動くPythonツールの運用設計

設定・再試行・停止処理・ログローテーションを考え、運用時の予測不能を減らします。

長時間動く診断ツールは、正常に起動するだけでは不十分です。電源断、通信断、ディスク不足、停止要求を想定し、失敗時に安全に終了または復旧できるようにします。

再試行を無限ループにしない

再試行が必要なら、最大回数、待ち時間、再試行してよい失敗の種類を定めます。状態変更コマンドは再送によって二重実行される可能性があるため、冪等性や確認応答を仕様で検証します。復旧できない場合はエラーを記録して停止し、機器を不定状態のまま放置しない方針を選びます。

設定とログを運用環境から分離する

ポート名やタイムアウトは設定として外出しし、秘密情報はリポジトリやログへ入れません。ログ容量の上限、ファイル権限、起動ユーザー、停止時のクリーンアップを運用手順に含めます。systemdなどでサービス化する場合は、対象Linuxの公式資料に従い、再起動ポリシーが故障を隠さないか確認します。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

import signal
import threading

stop_requested = threading.Event()

def request_stop(signum, frame) -> None:
    stop_requested.set()

signal.signal(signal.SIGTERM, request_stop)
while not stop_requested.wait(timeout=0.5):
    poll_once()  # タイムアウト付きで一度だけ状態を確認
close_device_safely()

手を動かす課題

終了要求を受けた際に通信を止めて資源を解放する経路をテストし、復旧しないエラーの扱いを文書化してください。

参考資料

「8. 非同期処理・依存関係・運用」の章一覧へ