なぜ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が認識していないようです。
これはバグですか?おそらく意図されていたのは、ファイルの最後に独自の行に改行があることでした。その場合、ドキュメントは誤解を招く可能性があります。または、このコンテキストで「改行」を正しく理解していない可能性があります...この問題についての説明が必要です。
これはバグですか?
いいえ。最後に改行文字のないファイルを作成しました。それにもかかわらず、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
と報告した場合、最後に改行があります。