ラズベリーパイでCronを使って定期処理を行う方法、ハマりポイントやCronが動かない場合の対処方法など

スポンサーリンク
Linux一般
スポンサーリンク

こんにちは!こー(@910zKoh)です。

突然ですが、毎日同じ時間に決まった処理をしたい事情が発生しました。処理自体はスクリプトを書いて自動化してあるので、あとは定期的に実行するためにCronを設定してあげれば良いだけです。

しかし、その為だけにPCを常時起動させておくのも消費電力的にもったいない気がしたので余っていたラズベリーパイを使うことにしました。

ラズベリーパイの購入はコチラから。

スポンサーリンク

環境

ハードウェア

Raspberry Pi 2 Model B

  • CPU : 900MHz クアッドコア
  • メモリ : 1GB
  • 消費電流(Typ.) : 350mA (1.75W)

OS

Raspberry PiのOSを確認しておきます。

pi@raspberrypi:~ $ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Cronの設定

Cronの書き方

以下のコマンドを実行し、書式に従って設定を書いてあげればいいだけです。

$ crontab -e

** 注:初回起動時はCronを編集するためのエディタの選択画面が表示されます。お好きなエディタを選んでください。 **

cronの書式は以下のとおりです。


分 時 日 月 曜日 '実行したいコマンドまたはスクリプト'

例えば毎日 2:00に一回だけ処理を実行したい場合は以下のように書きます。


0 2 * * * '実行したいコマンドまたはスクリプト'

また、以下のように書くと5分間隔で処理が実行されます。


/5 * * * * '実行したいコマンドまたはスクリプト'

以下のコマンドでCronの設定内容を確認できます。


$ crontab -l

注:”crontab -r”としてしまうとCronの設定が全て削除されてしまうのでご注意ください

Cronの起動、再起動、停止、ステータス確認

Cronの起動

$ sudo /etc/init.d/cron start

Cronの再起動

$ sudo /etc/init.d/cron restart

Cronの停止

$ sudo /etc/init.d/cron stop

Cronのステータス確認

$ sudo /etc/init.d/cron status

Cronがうまく動かない場合の対処法

Cronがうまく動いてくれない場合があると思います。そんなときは以下の手順で確認してみると良いです。

Cronが動いているか確認する

上記のステータス確認のコマンドでCronが動いているか確認してみます。

$ sudo /etc/init.d/cron status

正常に動いていれば以下のように表示されます。”Active”のところが”active (running)”になっています。

● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-08-20 22:55:57 JST; 21h ago
     Docs: man:cron(8)
 Main PID: 3259 (cron)
   CGroup: /system.slice/cron.service
           └─3259 /usr/sbin/cron -f

動作が停止しているときは以下のように表示されます。”Active”のところが”inactive (dead)”になっています。

● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Tue 2018-08-21 20:40:57 JST; 2s ago
     Docs: man:cron(8)
  Process: 3259 ExecStart=/usr/sbin/cron -f $EXTRA_OPTS (code=killed, signal=TERM)
 Main PID: 3259 (code=killed, signal=TERM)

ログを確認してみる

デフォルトではCronのログが出力されないようになっているため、rsyslogの設定ファイルを編集します。

$ sudo vi /etc/rsyslog.conf

以下の行(私のときは63行目でした)のコメントアウトを解除(先頭の”#”記号を削除)します。

cron.*                          /var/log/cron.log

ファイルを閉じて、rsyslogを再起動します。

$ sudo /etc/init.d/rsyslog restart

次に出力するログのレベルを設定します。

$ sudo vi /etc/default/cron

出力したいログのレベルを”EXTRA_OPTS=””のところに書き込みます。レベルは数字の足し算で設定するようです。

# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS='-L 15'

ファイルを閉じて、Cronを再起動します。

$ sudo /etc/init.d/cron restart

ログファイルを確認します。

tail -f /var/log/cron.log

スクリプトの実行権限を確認する

以下のコマンドを実行し、対象のスクリプトファイルの権限を確認します。実行権限が無い場合はchmodコマンドで実行権限を付与してあげてください。

$ ls -l '対象のスクリプトファイル'

スクリプトの内容を確認する

スクリプトをCronで実行する場合、ホームフォルダが実行フォルダになります。スクリプト内でディレクトリの作成や削除、ディレクトリ移動を行う場合にスクリプトファイルを基準とした相対パスで記述しているとエラーになる場合がお多いです(私もこれでハマりました)。

Cronで実行するスクリプトを作成する際は、パスは絶対パスで書くようにしておくと事故が少ないようです(それか上記の特性を頭に入れて書く)。

参考にしたサイト

決まった時間に処理する
cronのログを出すように設定する
crontabを設定しても実行されない時の確認ポイント

コメント