0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【pywin32】PythonスクリプトをWindowsサービス化して冗長性の高いシステムを構築する

0
Posted at

はじめに

本記事では、pywin32を使ってPythonスクリプトをWindowsサービスとして
登録・運用する手順
をまとめています。

背景

以前は、BAT ファイルでスクリプトを起動していました。
しかしこの運用には、以下の課題がありました。

課題 内容
手動起動 PC再起動のたびに手動でBATファイルを実行する必要があった
誤操作リスク 誤操作によるシステムの停止・二重起動が防げなかった
ログ不足 未捕捉のエラーが発生しても原因を追跡できなかった

Windowsサービス化で解決したこと

改善点 内容
自動起動 PCを起動するだけでスクリプトが自動起動
誤操作防止 サービス管理画面で起動・停止を一元管理
ログ記録 未捕捉エラーをイベントビューアーに自動記録

対象読者

  • PythonスクリプトをWindowsで常駐プロセスとして動かしたい方
  • BATファイル運用に課題を感じている方

実行環境

項目 バージョン
OS Windows 11
Python 3.x
pywin32 最新版

1. pywin32のインストール

管理者権限が必要です。コマンドプロンプトは右クリック→「管理者として実行」で開いてください。

以下の順番で実行します。

pip install pywin32
python -m pywin32_postinstall -install

エラーが出た場合

以下のエラーが出た場合は、インストーラーのパスが通っていません。

can't open file '...\pywin32_postinstall.py': [Errno 2] No such file or directory

Scriptsフォルダへ移動してから実行してください。

cd C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python3x\Scripts
python pywin32_postinstall.py -install

2. サービス用Pythonファイルの作成

以下のコードをmy_service.pyとして保存します。

import win32serviceutil
import win32service
import win32event

class MyService(win32serviceutil.ServiceFramework):
    _svc_name_ = "MyService"               # サービス名(sc コマンドで使う識別子)
    _svc_display_name_ = "My Service"      # サービス一覧に表示される名前
    _svc_description_ = "サンプルサービス"  # サービスの説明

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)

    def SvcStop(self):
        # サービス停止時に呼ばれる。停止処理をここに書く。
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        # サービス開始時に呼ばれる。メイン処理をここに書く。
        win32event.WaitForSingleObject(self.hWaitStop, win32event.INFINITE)

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(MyService)

3. サービスの登録・設定・操作

登録から自動起動設定まで

my_service.pyがあるディレクトリで以下を順番に実行します。

# インストール
python my_service.py install

# PC起動時に自動起動するよう設定
sc config MyService start= auto

# 障害時に5秒後に自動再起動するよう設定(3回まで、1時間でカウントリセット)
sc failure MyService reset= 3600 actions= restart/5000/restart/5000/restart/5000

日常的な操作コマンド

操作 コマンド
状態確認 python my_service.py status
起動 python my_service.py start
停止 python my_service.py stop
アンインストール python my_service.py remove

sc failureコマンドの補足

オプション 意味
reset= 3600 失敗カウンターを3600秒(1時間)でリセット
actions= restart/5000 失敗時に5000ミリ秒(5秒)後に再起動
restart/5000/restart/5000/restart/5000 最大3回まで再起動を試みる

まとめ

今回はpywin32を使って、PythonスクリプトをWindowsサービスとして
登録・運用する手順をまとめました。

BATファイル運用と比較すると、以下の点が改善されます。

項目 BATファイル Windowsサービス
自動起動 ❌ 手動 ✅ OS起動時に自動
二重起動防止 ❌ なし ✅ あり
障害時の自動回復 ❌ なし ✅ sc failureで設定可能
エラーログ ❌ 残らない ✅ イベントビューアーに記録

常駐プロセスの運用が必要な場面では、積極的に活用していきましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?