share facebook facebook2 twitter menu hatena pocket slack

2017.06.06 TUE

cron で少しばかりくろーん(苦労)した話

川原 洋平

WRITTEN BY 川原 洋平

はじめに

これは

cron の設定で少しばかりくろーん(苦労)した話をざっくりと纏めたものです。
結局、man cronして解決しました。

環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

cron で動かすとあるアプリケーション

cron.txt

crontab で定義せずに /etc/cron.d/ 以下に定義ファイルを置くのが個人的なトレンド。

$ echo "* * * * * echo 'test' >> /tmp/test.txt" > cron.txt
$ sudo ln -s cron.txt /etc/cron.d/test_cron

シンボリックリンクで /etc/cron.d/ 以下に設定。
完璧…(だと思った。

くろーん(苦労)の始まり

tail -f /var/log/syslog (1)

May 19 10:51:01 ubuntu-xenial cron[1077]: (*system*test_cron) WRONG FILE OWNER (/etc/cron.d/test_cron)

おや、なんかエラーが出て cron.txt で指定した処理が動いていないぞ。
エラーメッセージにも出ているように /etc/cron.d/test_cron の元ファイルである cron.txt のオーナーを変更しよう。

$ sudo chown root:root cron.txt

よし、これで安心。

tail -f /var/log/syslog (2)

May 19 10:52:01 ubuntu-xenial cron[1077]: (*system*test_cron) INSECURE MODE (group/other writable) (/etc/cron.d/test_cron)

なぬ、パーミッション問題… Group と Other には書き込み権限を付けていたらダメなんか。
改めて、cron.txt の権限を644に変更。

$ sudo chown 644 cron.txt

きっと大丈夫でしょう。

tail -f /var/log/syslog (3)

May 19 12:09:01 ubuntu-xenial cron[1077]: Error: bad username; while reading /etc/cron.d/test_cron
May 19 12:09:01 ubuntu-xenial cron[1077]: (*system*test_cron) ERROR (Syntax error, this crontab file will be ignored)

えー、そうなのか…。
/etc/cron.d/ 以下に設置する cron の定義にはユーザー名を明記する必要があるようです。

$ sudo sh -c "echo \"* * * * * ubuntu echo 'test' >> /tmp/test.txt\" > cron.txt"

やっとこさ

動いた。

$ cat /tmp/test.txt
test
...
test

man cron

/etc/cron.d/ 以下に設置するファイルのオーナーと権限

該当していそうなところを抜粋。

/etc/crontab and the files in /etc/cron.d must be owned by root, and must not be group- or other-writable. In contrast to the spool area, the files under /etc/cron.d or the files under /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and /etc/cron.monthly may also be symlinks, provided that both the symlink and the file it points to are owned by root. The files under /etc/cron.d do not need to be executable, while the files under /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and /etc/cron.monthly do, as they are run by run-parts (see run-parts(8) for more information).

ざっくり要約すると…

  • /etc/crontab/etc/cron.d 以下に置くファイルのオーナーはroot であること
  • Group と Other に書き込み権限が無いこと(644 ってことかな)
  • シンボリックな場合でも、シンボリックリンク及びリンク元のファイルもオーナーはroot であること
  • /etc/cron.d 以下のファイルには実行権限は要らないよ

/etc/cron.d/ 以下に設置するファイルのフォーマット

同じく、該当していそうなところを抜粋。

Support for /etc/cron.d is included in the cron daemon itself, which handles this location as the system-wide crontab spool. This directory can contain any file defining tasks following the format used in /etc/crontab, i.e. unlike the user cron spool, these files must provide the username to run the task as in the task definition.

こちらもざっくり意訳。
/etc/cron.d 以下はシステムワイドな crontab スプールとして cron デーモンから利用されるので、個々のタスク定義には実行するユーザー名を明記する必要がある。

ということで

man 有難い

ググるより前に man が必要マン。

cron って

奥深い。

出直してきます

cron で少しばかりくろーん(苦労)した話でした。
お疲れさまでした。

元記事はこちら

cron で少しばかりくろーん(苦労)した話