こんにちは!こー(@910zKoh)です。
突然ですが、毎日同じ時間に決まった処理をしたい事情が発生しました。処理自体はスクリプトを書いて自動化してあるので、あとは定期的に実行するためにCronを設定してあげれば良いだけです。
しかし、その為だけにPCを常時起動させておくのも消費電力的にもったいない気がしたので余っていたラズベリーパイを使うことにしました。
Contents
環境
ハードウェア
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で実行するスクリプトを作成する際は、パスは絶対パスで書くようにしておくと事故が少ないようです(それか上記の特性を頭に入れて書く)。
コメント