Python × Linux:サーバ上でスクリプトを自動実行する方法【cron・systemd対応】

はじめに

Linuxサーバ上でPythonスクリプトを定期的または自動的に実行したい場面は多くあります。
例えば以下のようなケースです。

  • 定期的なログ解析・レポート生成
  • バッチ処理によるデータ収集・更新
  • サーバ監視や通知処理の自動化
  • バックアップやメンテナンスタスクの自動実行

本記事では、Python × Linux環境でスクリプトを自動実行する基本から実践までを、cron と systemd を中心に解説します。


1. 前提環境と基本構成

想定環境

  • OS:Linux(Ubuntu / Rocky Linux / Amazon Linux など)
  • Python:Python 3.x
  • 実行ユーザー:一般ユーザー(root非推奨)

サンプルPythonスクリプト

まずは簡単な例を用意します。

#!/usr/bin/env python3
from datetime import datetime

with open("/var/log/sample_python_job.log", "a") as f:
    f.write(f"Executed at {datetime.now()}\n")

実行権限を付与

chmod +x sample_job.py

2. cronを使った定期実行(基本)

cronとは

cron はLinuxで最も一般的な定期実行(スケジューラ)です。
分・時・日・月・曜日を指定してコマンドを実行できます。

crontabの編集

crontab -e

毎日3時にPythonスクリプトを実行する例

0 3 * * * /usr/bin/python3 /home/user/sample_job.py

ポイント

  • Pythonのフルパスを指定する which python3
  • 相対パスは使わず絶対パスで記述する
  • cron実行時はPATHが限定的

3. 仮想環境(venv / pyenv)を使う場合の注意点

venvを利用する例

0 3 * * * /home/user/venv/bin/python /home/user/sample_job.py

よくあるトラブル

  • cron実行時にライブラリが見つからない
  • 環境変数が読み込まれない

対策

  • 仮想環境のPythonを直接指定する
  • 必要なら .envexport を明示的に記述

4. ログ出力とエラーハンドリング

cron実行結果をログに残す

0 3 * * * /usr/bin/python3 /home/user/sample_job.py >> /var/log/sample_job.log 2>&1
  • >>:標準出力
  • 2>&1:標準エラーも同じログへ

Python側での例外処理

try:
    # main logic
    pass
except Exception as e:
    with open("/var/log/sample_python_job_error.log", "a") as f:
        f.write(str(e))

5. systemdでの自動実行(常駐・高信頼)

systemdを使うメリット

  • 実行状態の管理が可能
  • 再起動時の自動起動
  • ログ管理が容易(journalctl)

serviceファイル例

/etc/systemd/system/sample_python.service
[Unit]
Description=Sample Python Job

[Service]
ExecStart=/usr/bin/python3 /home/user/sample_job.py
Restart=always
User=user

[Install]
WantedBy=multi-user.target

有効化と起動

sudo systemctl daemon-reload
sudo systemctl enable sample_python.service
sudo systemctl start sample_python.service

6. cron と systemd の使い分け

用途推奨
単純な定期バッチcron
常駐プロセスsystemd
再起動耐性が必要systemd
簡易自動化cron

7. セキュリティ・運用上の注意点

  • root実行は極力避ける
  • スクリプト内に平文の認証情報を書かない
  • 権限(chmod / chown)を最小限に
  • ログ肥大化に注意(logrotate)

まとめ

PythonとLinuxを組み合わせることで、サーバ運用の自動化・省力化は大きく進みます。

  • 定期実行 → cron
  • 常駐・サービス化 → systemd
  • 仮想環境やログ管理を考慮すると安定運用が可能

小さな自動化から始めて、徐々に運用レベルを高めていくことが重要です。

タイトルとURLをコピーしました