Hisakeyのブログ

エンジニアが色々呟くブログです。

ラズパイで理解するLinuxのcronとは

はじめに

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. 実行手順

  1. このスクリプトに実行権限をつけます:

最初は、スクリプトの実行許可がついていないので、実行権限を付与します。

chmod +x register_cron.sh
  1. スクリプトを実行してcronを登録:
./register_cron.sh
  1. 登録されたか確認:
crontab -l

学び・気づき・解釈

cronってなに?

cronは、LinuxRaspberry 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はLinux標準の自動実行ツール
  • 書き方は「分 時 日 月 曜日 コマンド」
  • crontab -lで確認、crontab ファイル名で登録
  • スクリプト化しておけば再設定もラク

これからラズパイを使った自動化に挑戦したい方には、ぜひcronを活用してほしいと思います!

参考リンク