web-dev-qa-db-ja.com

cronは、ファイルの最後の行に改行文字を必要とするようです

なぜcronが特定のcrontabファイルの操作を拒否するのかを理解しようとしています。 crontabのマンページには次のように書かれています。

cronでは、crontabの各エントリが改行文字で終わる必要があります。 crontabの最後のエントリに改行がない場合、cronはcrontabが(少なくとも部分的に)壊れていると見なし、インストールを拒否します。

次のcronファイルがあるとします。

#はFabric $ 
 $ 
 Shell =/bin/sh $ 
 PATH =/usr/local/sbin:/ usr/local/bin:/によって管理されていますsbin:/ bin:/ usr/sbin:/ usr/bin $ 
 $ 
#mh dom mon dow user command $ 
 17 * * * * root cd/&& run- parts --report /etc/cron.hourly$
25 6 * * * root test -x/usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.daily)$ 
 47 6 * * 7 root test -x/usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.weekly)$ 
 52 6 1 * * root test -x/usr/sbin/anacron || (cd/&& run-parts --report /etc/cron.monthly)$ 
 $ 
#Postgres monitoring $ 
 * * * * * postgres cd/&&/etc/cron.d/pgup.sh $ 
 */5 * * * * postgres cd/&& /etc/cron.d/aws-scripts-mon/mon-put-instance-data.pl --mem- avail --disk-space-util --disk-path =/mnt $ 
 $ 
#Postgres Backup $ 
 00 00 * * * postgres /etc/cron.d/ pgbackup.sh $ 

「$」文字はLF(vim unix format)文字を示すことに注意してください。

Cronを再起動すると、syslogに次のエラーが表示されます。

Mar 31 17:34:02 postgres-primary0 cron [30852]:(system)エラー(EOFの前に改行がない、このcrontabファイルは無視されます)

また、cronファイルの最後に空白行を追加しても、cronの再起動時にエラーは発生しません。

結論:

私の知る限り、最後のエントリは改行文字で終わります。したがって、crontabが認識していないようです。

これはバグですか?おそらく意図されていたのは、ファイルの最後に独自の行に改行があることでした。その場合、ドキュメントは誤解を招く可能性があります。または、このコンテキストで「改行」を正しく理解していない可能性があります...この問題についての説明が必要です。

7
lps

これはバグですか?

いいえ。最後に改行文字のないファイルを作成しました。それにもかかわらず、Vim(:set listの後)は最後に$を示します。あなたの前提が間違っているようです、あなたのファイルには最後の改行がありません、cronは意図したように機能します。


ノート:

  • [〜#〜] posix [〜#〜] は、行が完了したと見なすために、末尾の改行文字が必要です。

    3.195不完全なライン
    ファイルの最後にある1つ以上の非<改行>文字のシーケンス。

    […]

    3.206ライン
    一連の0個以上の非<改行>文字と終了<改行>文字。

    したがって、cronの動作は単なる恣意的なものではありません(ただし、ツールはそれほど制限的ではないかもしれません)。詳細については、 テキストファイルの最後に改行が必要なのはなぜですか? をご覧ください。

  • デフォルト設定のVimは、保存中に欠落している改行を修正します(ただし、 しないように指示する の場合を除きます)。

  • 末尾に改行文字があるかどうかを確認するには、ファイルの16進ダンプを作成します。 hexdump the_fileまたはxxd the_file。 crontabの場合、これは難しいかもしれません。私のDebianではcrontabは/var/spool/cron/crontabs/kamilですが、通常のユーザーとして/var/spool/cron/crontabs/にアクセスできないため、ファイルをxxdすることはできません。これを克服するには、次のトリックを使用できます。

    EDITOR=xxd crontab -e
    

    最後のバイトが0aと報告した場合、最後に改行があります。

2