crontabがトリガーされなかったのはなぜですか?


29

私が使用crontab -e私のcrontabに以下の行を追加します:

* * * * * echo hi >> /home/myusername/test

それでも、テストファイルが書き込まれていることはわかりません。これは許可の問題ですか、またはcrontabは正しく機能していませんか?

cronプロセスが実行されていることがわかります。どうすればこれをデバッグできますか?

編集は - Ubuntuは書いていますcrontabファイルについての素晴らしい質問を、残念ながらまだ私を助けていないこと、。

編集2-うーん、私のテストファイルには214行あるようです。つまり、最後の214分間は毎分書き込まれているということです。何が問題だったのかはわかりませんが、明らかになくなっています。

回答:


23

cron更新されたcrontabファイルを毎分チェックし、次の分まで新しいエントリを考慮しない実装(すべてではないが、どのオフハンドか覚えていないが、Linuxでの実装に遭遇した)がある。したがって、crontabが初めて起動するまでに最大2分かかることがあります。これはあなたが観察したものかもしれません。


1
Solarisか、おそらく初期のSolarisでしょう。crontabエントリからスクリプトをテストするとき、cronエントリを3〜5分後に実行する習慣があります。これは、この動作に常にだまされていたためです。
ブルースエディガー

fcronこれも行います。
プネヘヘ

「チェック」ルーチンに数分以上かかる場合はどうなりますか?この長い「チェック」中にトリガーされなかったcronジョブがあります。
オスパイダー

@ospiderチェックには、ほんの一瞬しかかかりません。
ジル 'SO-悪であるのをやめる'

28

cronjobの後に空の行を追加しましたか?


cronjobの後に空の行があります。
ripper234

4
空の行ではなく、最後の行の最後にある改行。テキストファイルは一連の行で構成され、各行は改行で終わるため、空でないテキストファイルはすべて改行文字で終わります。一部のユーティリティは、ファイル内の最後の改行以降は何も処理しません。
ジル 'SO-悪であるのをやめる'

1
これは用語の質問です。「改行文字」は「この文字がテキストの新しい行を開始した後」を意味します。したがって、最後の改行とEOFの間の0バイトも空行(「0文字を含む行」)と見なされる場合があります
-gelraen

10

私は同じ問題を抱えていました-最後に新しいエントリを追加した後、動作中のcrontabが突然停止しました。最後の行の後に改行を入れるのを忘れていたことがわかりました。

コマンドを発行して見つけました

cat /var/log/syslog | grep crontab

そして出力は問題を示しました:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

改行を追加して保存すると、問題が修正されました。


5

このような音は修正されました。次回は、STDERRも記録してみてください。以下は、STDERRではなく、STDOUTにのみ記録します。

* * * * * echo hi >> /home/myusername/test

STDERRにも明示的な句があることを確認してください。そうしないと、Cronの設定方法に応じて、STDERRがユーザーにメールで送信されるか(メールが機能していると仮定して)、どこにも行かない場合があります。

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

私の好みは、cronjob出力をsyslogに送信することです。その方法で、既存のsyslogインフラストラクチャ(集中型syslog、Splunk、ログのローテーションは既にサポートされています。/var/log/messagesと/ var / log / cronjobなどのメッセージを簡単に比較できます)を利用しています。不要な電子メールでシステム管理者(私)をスパムします。

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

私にとって問題は、スクリプトが実行可能でなかったことです。私が持っていたのcrontab -eこのようなセットアップを

* * * * * /bin/my-script.sh

そして、ファイルmyscriptは実行可能でなかったので、私は走りました

chmod +x my-script.sh

すぐに、期待どおりに出力が表示され始めました。


1

に変更myusernaeすると、コンピューターでcron行が正常に機能しphuneheheます。システムの何が問題なのかを調べるには、いくつかの方法があります。

Cronは通常、何か問題がある場合にユーザーにメールを送信します。「メールがあります」というメッセージが表示された場合は、メールクライアントを使用して受信トレイ確認してください。または、ホームディレクトリを確認してくださいdead.letter。そこに名前のファイルがある可能性があります。

/var/log/cronに関連するエントリを確認できます。私のコンピューターでは、ログファイルがあります/var/log/cron/current(ルートアクセスが必要です)。

ルートアクセスがある場合は、cronデーモンを停止してデバッグモードで起動できます。たとえば、私は使用します(fcronデーモンの名前を変更します):

killall fcron
fcron --foreground --debug

デーモンの名前を調べるにはどうすればよいですか?
ripper234

@ ripper234を使用するps -ef | grep cronと、cronの行が表示されます。cronのmanページをチェックして、デバッグ用のフラグを確認してください。Vixie Cronを使用している可能性があります-x。その場合、デバッグフラグはです。cronプロセスを強制終了し、追加のフラグを付けて再起動します。
プネヘヘ

/ var / log / syslogも確認してください。私の場合、cronファイルがグループ書き込み可能であるという警告がありました。
よくあなたの改造を扱う

1

おそらく、cronが失敗すると、そのコンピューターのcronジョブのユーザーIDに電子メールが生成されます。コンピューターでMTAが動作していない場合、またはそのメールを他の場所で読んだり転送したりしていない場合、MTAが動作していてもそのメッセージは表示されません。

メールでcrontabのエラーを取得する良い方法は、crontabを次のようにすることです。

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

明らかに、myemail @ example.comではなく、メールアドレスを使用してください。これは、ローカルアカウントではなく、メールアドレスにエラーを送信するようにcronに指示します。特に、これは単に出力を送信したいルートcrontab(または/etc/cron.dのcrontabフラグメント)がある場合に便利です。ルートのメールボックスまたはルートの転送アドレスをスパムすることを回避できます。


システムにSMTP /送信メールサーバーが構成されているかどうかわかりません。オッズはそうではないということです。
ripper234

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.