Cron

実行権限

Cronを実行するユーザーが、実行権限を有しているのかを確認する。

$ cd /path/to/script/
$ ll
total 4
-rwxr-xr-- 1 root root 1386 Oct 13 20:34 contents_backup.sh
権限 実行可能範囲 有効範囲
‘rwx’ 4+2+1(参照+書込+実行)可能 自分自身
‘r-x’ 4+1(参照+実行)可能 同じグループのユーザー
‘r–‘ 4(参照)可能 他のユーザー

“sh”で実行した場合、”sh”の引数としてScriptを実行しているため考慮しないが、Cronが実行する場合は実行権限と、Script内にShebang(Script内の先頭に記載される”#!/bin/sh, #!/bin/bash”等)が記載されているかを確認する。

下記のようにDB接続用ファイルやスクリプトファイルの権限は適切に設定する。
▼設定例

$ tree -d /root/scripts/
/root/scripts/
└── backup_script

$ tree -d /backups/
/backups/
├── contents
│   ├── 20171016
│   └── 20171017
└── databases
    └── 20171017

$ cd /root/scripts/backup_script/
$ chmod 0500 contents_backup.sh
$ chmod 0500 database_backup.sh
$ chmod 0600 .access-db.conf
$ ls -la
-r-x------ 1 root root 1414 Oct 13 20:41 contents_backup.sh
-r-x------ 1 root root 2105 Oct 17 11:44 database_backup.sh
-rw------- 1 root root   54 Oct 17 11:36 .access-db.conf

コマンド

# cronの場所を確認
$ which crontab

# Crondの状態確認
$ /etc/rc.d/init.d/crond status
$ service crond status

# Cronの開始
$ service crond start

# ユーザーを指定し、動作しているCronを確認
$ crontab -u root -l

# crontabを編集
$ crontab -e

# 該当ファイルを確認
$ sudo more /var/spool/cron/{user}

# logで動作しているcronを確認
$ sudo tail -f /var/log/cron

  • 毎日実行されるCron: /etc/cron.daily/xxx
  • 毎時実行されるCron: /etc/cron.hourly/xxx
  • 毎週実行されるCron: /etc/cron.weekly/xxx

上記ディレクトリにShell Scriptを配置した場合、”/etc/crontab”のMAILTOオプションが有効となる。
“crontab -e”で編集した場合、コマンドの標準出力がcrontabを設定したユーザーへメール通知される。ファイルの実態は”/var/spool/cron/{USER_NAME}”に存在する。

記述方法

0 22 * * * root /sbin/shutdown -h now >/dev/null 2>&1
00 3 * * * /bin/sh /opt/tools/logrotate.sh >/dev/null 2>&1
*/5 * * * * wget -O /tmp/publish.log http://xxx/publishscheduled.jsp >/dev/null 2>&1

01(分) *(時) *(日) *(月) *(曜日) [ユーザー] [コマンド]

設定可能な値/範囲
*, もしくは0-59
*, もしくは0-23
*, もしくは1-31
*, もしくは1-12, もしくはjan,feb,mar,apr..
曜日 *, もしくは0-7(0,7は日曜日), もしくはsan,sat,tue..
ユーザー 実行ユーザー
コマンド 実行コマンド
指定方法 説明
複数時間 05,10,20 * * * * 毎時5分,10分,20分と3回実行させる場合、カンマ区切りで時間指定を行う。
連続実行 05-20 * * * * 毎時05~20分まで毎分実行させる場合、ハイフン区切りで時間指定を行う。
間隔実行 */5 * * * * 5分毎に実行させる場合、スラッシュで時間指定を行う。

実行Shell, PATH, 送信メールアドレス等

/etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
変数 意味
SHELL Cronで使用されるシェル
PATH Cronに教えるパス
MAILTO Cronの実行結果を送るユーザ, 若しくはメールアドレス
HOME Cronの実行ディレクトリ

/etc/cron.d/0hourly

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

所有者ROOTで、パーミッション0644 で “/etc/cron.d” ディレクトリを記載 (“/etc/crontab” と同様の書式で記載)

Crontabを編集する際は、別ファイルへ書き出してから編集し、元に反映させる。

$ crontab -l > ~/crontab
$ vim ~/crontab
$ crontab < ~/crontab

ShellScript内でエラーが発生した場合、必ず標準エラ―出力する。

echo "error" 1>&2
# もしくは echo "error" > /dev/stderr
exit 1

検証

1分毎に動作するようにして、動作確認を行う。

* * * * * /bin/sh /root/scripts/test.sh 1> /dev/null 2> /dev/null

エラーログ

ログファイルで確認。

$ less -N /var/log/cron

Crontabを編集、MAILTOにメールアドレスを設定。
MAILTO=”xxx@gmail.com”

$ crontab -e

crondを再起動する。

$ service crond restart

トラブルシューティング

Cronが実行されない

Cronの動作確認

$ /etc/rc.d/init.d/crond status
# 又は
$ service crond status
crond (pid  2901) is running...

自動起動の確認 (2~5がonになっているか)

$ chkconfig --list crond
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

# 自動起動をON
$ chkconfig crond on

実行権限の確認

$ ls -la /root/scripts/
-rw-r--r-- 1 root root  166 Oct 18 18:38 test.sh
$ chmod +x /root/scripts/test.sh

実行内容の確認

実行内容にエラーがあってもCronのログに残らない為、下記のようにファイルへ出力する。

# 標準出力と標準エラー出力を個々のファイルへ出力する
* * * * * /bin/sh /root/scripts/test.sh 1>> /tmp/cron.log 2>> /tmp/cron-err.log

メールが来ない

MAILTOの設定確認をする。

$ vim /etc/crontab
$ /usr/bin/crontab -l