概要
cronの設定ファイルの末尾には改行が必要です.
経緯・詳細
cronでLet’s Encryptの証明書更新を自動化しようとしていたところ,設定ファイルの書き方の問題でcronで定期実行されていないことに気づきました.
設定ファイルをcatした際のプロンプトの返り方が末尾に改行が無いファイルをcatした際のそれであったため気づいた次第です.
まず,実行されない問題のある書き方です.
$ cat -E /etc/cron.d/letsencrypt 00 04 * * * root /usr/bin/certbot renew --post-hook "apachectl graceful"
次に,正しい書き方です.
$ cat -E /etc/cron.d/letsencrypt 00 04 * * * root /usr/bin/certbot renew --post-hook "apachectl graceful"$
catコマンドに -E オプションを付して実行することで各行の末尾に $ が表示されます.-e オプション(-vE と同等)や -A オプションでも問題ありません.
2つの実行結果の違いから,正しく実行されない問題のある書き方の場合は末尾に改行が不足していることが分かります.
cronの設定ファイルは末尾に改行が必要なようです.
少し分かりにくいのでバイナリエディタでも確認してみます.
確認はEmacsのHexlモードで行います.
まず,問題のある書き方.
87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef 00000000: 3030 2032 3020 2a20 2a20 2a20 726f 6f74 00 20 * * * root 00000010: 202f 7573 722f 6269 6e2f 6365 7274 626f /usr/bin/certbo 00000020: 7420 7265 6e65 7720 2d2d 706f 7374 2d68 t renew --post-h 00000030: 6f6f 6b20 2261 7061 6368 6563 746c 2067 ook "apachectl g 00000040: 7261 6365 6675 6c22 raceful"
次に,正しい書き方です.
87654321 0011 2233 4455 6677 8899 aabb ccdd eeff 0123456789abcdef 00000000: 3030 2032 3020 2a20 2a20 2a20 726f 6f74 00 20 * * * root 00000010: 202f 7573 722f 6269 6e2f 6365 7274 626f /usr/bin/certbo 00000020: 7420 7265 6e65 7720 2d2d 706f 7374 2d68 t renew --post-h 00000030: 6f6f 6b20 2261 7061 6368 6563 746c 2067 ook "apachectl g 00000040: 7261 6365 6675 6c22 0a raceful".
ファイル末尾の 0a の有無が異なります.
0a の正体は改行コードの \n です.
また,ASCIIコード表を参照すると,以下のように 0a は改行コードであることが分かります.
$ man ascii | grep -i '0a' 012 10 0A LF '\n' (new line) 112 74 4A J
以上,cronの設定ファイルの末尾には改行が必要という内容でした.
ASCIIコードは以下のように確認できます.
また,The Linux man-pages project からも確認可能です.
https://man7.org/linux/man-pages/man7/ascii.7.html
$ man ascii ASCII(7) Linux Programmer's Manual ASCII(7) NAME ascii - ASCII character set encoded in octal, decimal, and hexadeci- mal DESCRIPTION ASCII is the American Standard Code for Information Interchange. It is a 7-bit code. Many 8-bit codes (e.g., ISO 8859-1) contain ASCII as their lower half. The international counterpart of ASCII is known as ISO 646-IRV. The following table contains the 128 ASCII characters. C program '\X' escapes are noted. Oct Dec Hex Char Oct Dec Hex Char ──────────────────────────────────────────────────────────────────────── 000 0 00 NUL '\0' (null character) 100 64 40 @ 001 1 01 SOH (start of heading) 101 65 41 A 002 2 02 STX (start of text) 102 66 42 B 003 3 03 ETX (end of text) 103 67 43 C 004 4 04 EOT (end of transmission) 104 68 44 D
原因
そもそも,なぜ末尾に改行がない設定ファイルを作成してしまったのか.
その理由は単純でした.
Emacsの設定ファイルには以下の設定を追加しています.
これによって,ファイルの末尾が改行で終わっていない場合にはバッファ保存時に自動的に改行が追加されます.
(setq require-final-newline t)
今回は,/etc/cron.d/ にあるファイルを編集するために sudo を利用してrootとして以下のようにファイル編集作業していたため自身の .emacs は読み込まれていません.
$ sudo emacs ファイル名
つまり,以下のようにEmacsを起動していれば良かったわけです.
$ sudo emacs -q -u ユーザ名 ファイル名
もしくは
$ sudo emacs -q -l Emacsの設定ファイル
Emacs起動時にオプションについてはEmacsのmanページ等を参照してください.