はじめに
本記事では、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で設定可能 |
| エラーログ | ❌ 残らない | ✅ イベントビューアーに記録 |
常駐プロセスの運用が必要な場面では、積極的に活用していきましょう!