はじめに
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を直接指定する
- 必要なら
.envやexportを明示的に記述
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
- 仮想環境やログ管理を考慮すると安定運用が可能
小さな自動化から始めて、徐々に運用レベルを高めていくことが重要です。

