cronの設定ファイルの末尾に改行が必要

概要

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ページ等を参照してください.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です