はじめに
Raspberry Pi(ラズパイ)を使い、Linuxの基礎知識を学習中です。
今回は、ラズパイのスクリプトを自動で定期実行できないかと思い、そんなときに使えるLinuxの機能「cron(クーロン)」を紹介します。
今回は、自分で初めてcronを使って「毎日定期的にPythonスクリプトを実行する」設定をしてみたので、その手順と気づいたことをまとめました。
背景・動機
Raspberry Piを使って、温湿度センサーのデータを取得し、それを定期的に通知するPythonスクリプトを作っていました。
でも、毎回ssh接続→python3 script.py
といった手動実行は現実的ではありません。
Linuxには「cron」を使って、Pythonスクリプトを定期実行できないかと思い、cron用のshファイルを作成することにしました。
実例・やってみたこと
1. まずはPythonスクリプトを用意
たとえば、以下のようなスクリプトを作っておきます。
# send_data.py print("データを送信しました")
今回は「このスクリプトを1日4回、自動で実行」したいと考えました。
2. cron設定用のシェルスクリプトを作成
以下の内容で register_cron.sh
というシェルスクリプトを作りました。
こちらのファイルは、同じSCRIPT_PATHを使っているcronであれば、更新できるようになっています。
処理の内容については、コメントを参照してください
#!/bin/bash SCRIPT_PATH="/home/user/device-platform/device/send_data.py" # 仮想環境(venv)を使用する場合、下記のパスを指定します。 PYTHON_PATH="/home/user/venv/bin/python" LOG_PATH="/home/user/send_log.txt" ERR_PATH="/home/user/send_error.txt" # 今回は、毎日6時間ごとに実行する CRON_JOB="0 */6 * * * $PYTHON_PATH $SCRIPT_PATH >> $LOG_PATH 2>> $ERR_PATH" # 現在のcron設定をTEMP_CRONに保存 TEMP_CRON=$(mktemp) # 現在、使用SCRIPT_PATHを使用しているcronを削除、それ以外をTEMP_CRONに保存 # 2>dev>nullは、エラー発生時は無視する crontab -l 2>/dev/null | grep -vF "$SCRIPT_PATH" > "$TEMP_CRON" # 新規cronの行を追加 echo "$CRON_JOB" >> "$TEMP_CRON" # crontabを更新 crontab "$TEMP_CRON" rm "$TEMP_CRON" echo "[OK] cronを登録しました:" echo "$CRON_JOB"
3. 実行手順
- このスクリプトに実行権限をつけます:
最初は、スクリプトの実行許可がついていないので、実行権限を付与します。
chmod +x register_cron.sh
- スクリプトを実行してcronを登録:
./register_cron.sh
- 登録されたか確認:
crontab -l
学び・気づき・解釈
cronってなに?
cronは、LinuxやRaspberry Piに標準で入っている「自動スケジューラー」です。
決まった時刻に、決まったコマンドを自動で実行してくれます。たとえば:
- 毎朝6時にバックアップを取る
- 1時間ごとにデータを取得する
- 毎週日曜にログを整理する
などが可能です。
cronの時間指定の書き方
分 時 日 月 曜 コマンド
今回の 0 */6 * * *
はこう読みます:
- 0分ちょうど
- 6時間ごと(0時、6時、12時、18時)
- 毎日
つまり「毎日、6時間ごとにスクリプトを実行」という意味になります。
ログの出力先を分けた理由
>> $LOG_PATH # 通常の出力ログ 2>> $ERR_PATH # エラーメッセージだけを記録
標準出力とエラーを別々に記録することで、スクリプトが失敗した原因をすぐに追えるようになります。
※Linuxでは、標準出力は 1>>
(1は省略可)、標準エラー出力は 2>>
で出力先を分けることができます
crontabを上書きする工夫
crontab -l | grep -vF "$SCRIPT_PATH"
これで、「同じスクリプトのcronが既に登録されている場合は削除」してから追加できます。二重登録を防げるので安心です。
まとめ
はじめてcronを使ってみて、「Linuxで定期実行ってこんなに簡単にできるんだ!」と驚きました。
ポイントは以下のとおり:
これからラズパイを使った自動化に挑戦したい方には、ぜひcronを活用してほしいと思います!