質問: crontabが機能しないのはなぜですか?どうすればトラブルシューティングできますか? これは、cronとcrontabの使用に関する 標準的な質問 です。 コミュニティはあなたの質問に対する答えが以下にあると確信しているので、あなたはここに導かれました。以下で質問に対する回答がない場合、回答は、コミュニティがあなたを助けるのに役立つ情報を収集するのに役立ちます。この情報は、元の質問に編集する必要があります。「なぜ私のcrontabが機能しないのですか、そしてどのようにトラブルシューティングできますか?」の答えは以下にあります。これは、crontabが強調表示されたcronシステムに対処します。
回答: すべてのcrontab関連の問題/問題を修正する方法(linux) これは community wiki です。この回答に誤りがあることに気付いた場合、または追加情報がある場合は、編集してください。 まず、基本的な用語: cron(8) は、スケジュールされたコマンドを実行するデーモンです。 crontab(1) は、ユーザーのcrontab(5)ファイルを変更するために使用されるプログラムです。 crontab(5) は、cron(8)の指示を含むユーザーごとのファイルです。 次に、cronに関する教育:システム上のすべてのユーザーは、独自のcrontabファイルを持っている場合があります。ルートとユーザーのcrontabファイルの場所はシステムによって異なりますが、通常は/var/spool/cronの下にあります。システム全体の/etc/crontabファイルがあり、/etc/cron.dディレクトリにはcrontabフラグメントが含まれている場合があります。一部のlinuxディストリビューション(red hatなど)にも/etc/cron.{hourly,daily,weekly,monthly}があり、これはディレクトリであり、スクリプトは1時間/日/週/月ごとにroot権限で実行されます。rootは常にcrontabコマンドを使用できます。通常のユーザーはアクセスを許可される場合とされない場合があります。コマンドcrontab -eを使用してcrontabファイルを編集し、保存すると、crondは基本的な有効性をチェックしますが、crontabファイルが正しく形成されることを保証しません。 cron.denyというファイルがあり、cronを使用できないユーザーを指定します。 cron.denyファイルの場所はシステムに依存しており、すべてのユーザーがcronを使用できるように削除できます。コンピューターの電源が入っていないか、crondデーモンが実行されておらず、コマンドを実行する日付/時刻が過ぎている場合、crondはキャッチアップせず、過去のクエリを実行しません。crontabの詳細、コマンドの作成方法:crontabコマンドは1行で表されます。 \を使用して、コマンドを複数行に拡張することはできません。ハッシュ(#)記号はコメントを表し、その行のすべてがcronによって無視されることを意味します。先頭の空白と空白行は無視されます。コマンドでパーセント(%)記号を使用する場合は、十分に注意してください。エスケープされない限り\%は改行に変換され、エスケープされていない最初の%以降のすべてがstdinのコマンドに渡されます。crontabファイルには2つの形式があります。 ユーザーcrontab # example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) or jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (sunday=0 or 7) # | | | | | # * * * * * command to be executed システム全体の/etc/crontabおよび/etc/cron.dフラグメント # example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) or jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (sunday=0 or 7) # | | | | | # * * * * * user-name command to be executed 後者にはユーザー名が必要です。コマンドは指定されたユーザーとして実行されます。行の最初の5つのフィールドは、コマンドを実行する時間を表します。時間指定では、数字または該当する場合は日/月の名前を使用できます。 フィールドはスペースまたはタブで区切られます。 コンマ(,)は、リストを指定するために使用されます(例:1,4,6,8)。これは、1,4,6,8で実行することを意味します。 範囲はダッシュ(-)で指定され、リストと組み合わせることができます。 1-3,9-12は、1と3の間、次に9と12の間を意味します。 /文字は、ステップを導入するために使用できます。 2/5は、2から始まり、5ごとに開始することを意味します(2、7、12、17、22 ...)。彼らは終わりを越えて折り返さない。 フィールド内のアスタリスク(*)は、そのフィールドの範囲全体を示します(たとえば、分フィールドの場合は0-59)。 範囲とステップは組み合わせることができます。 */2は、関連するフィールドの最小値から開始し、その後2ごとに開始することを意味します。 0は分(0,2 ... 58)、1は月(1,3 ... 11)など. cronコマンドのデバッグメールをチェック!デフォルトでは、cronはコマンドからの出力を、コマンドを実行しているユーザーにメールで送信します。出力がない場合、メールは送信されません。 cronから別のアカウントにメールを送信する場合は、crontabファイルでmailto環境変数を設定できます。mailto=user@somehost.tld 1 2 * * * /path/to/your/command 自分で出力をキャプチャするstdoutとstderrをファイルにリダイレクトできます。出力をキャプチャするための正確な構文は、シェルcronが使用しているものによって異なる場合があります。次に、すべての出力を/tmp/mycommand.logのファイルに保存する2つの例を示します。1 2 * * * /path/to/your/command &>/tmp/mycommand.log 1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1 ログを見るcronはsyslogを介してアクションをログに記録します。これは(設定によって異なりますが)/var/log/cronまたは/var/log/syslogに頻繁に送られます。必要に応じて、cronステートメントを次のようにフィルタリングできます。grep cron /var/log/syslog ファイルの場所とそれらの使用方法について、cronの基本について説明しました。次に、いくつかの一般的な問題を見てみましょう。cronが実行されていることを確認するcronが実行されていない場合、コマンドはスケジュールされません...ps -ef | grep cron | grep -v grep あなたのようなものを得るはずですroot 1224 1 0 nov16 ? 00:00:03 cron またはroot 2018 1 0 nov14 ? 00:00:06 crond 再起動しない場合/sbin/service cron start または/sbin/service crond start 他の方法があるかもしれません。ディストリビューションが提供するものを使用してください。cronは、制限された環境でコマンドを実行します。使用できる環境変数は非常に限られている可能性があります。通常、$logname、$home、$pathなど、定義されているいくつかの変数のみを取得します。特に注目すべきは、pathが/bin:/usr/binに制限されていることです。 「私のcronスクリプトが機能しない」問題の大部分は、この限定的なパスが原因です。コマンドが別の場所にある場合、いくつかの方法でこれを解決できます。 コマンドの絶対パスを入力します。 1 2 * * * /path/to/your/command crontabファイルに適切なpathを提供します path=/bin:/usr/bin:/path/to/something/else 1 2 * * * command コマンドで他の環境変数が必要な場合は、crontabファイルでも定義できます。cronはcwd == $ homeでコマンドを実行します実行するプログラムがファイルシステムのどこにあるかに関係なく、cronを実行したときのプログラムの現在の作業ディレクトリはユーザーのホームディレクトリになります。プログラム内のファイルにアクセスする場合、相対パスを使用する場合はこれを考慮する必要があります。または、(できれば)どこでも完全修飾パスを使用するだけで、誰もが混乱するのを防ぐことができます。crontabの最後のコマンドが実行されないcronでは通常、コマンドを改行で終了する必要があります。 crontabを編集します。最後のコマンドを含む行の終わりに移動し、新しい行を挿入します(enterキーを押します)。crontab形式を確認する/ etc/crontabまたは/etc/cron.dのフラグメントにユーザーcrontabでフォーマットされたcrontabを使用することはできません。逆も同様です。ユーザーでフォーマットされたcrontabは行の6番目の位置にユーザー名を含みませんが、システムでフォーマットされたcrontabはユーザー名を含み、そのユーザーとしてコマンドを実行します。/etc/cron.{hourly,daily,weekly,monthly}にファイルを置いたが実行されない ファイル名に拡張子がないことを確認してください run-parts を参照してください ファイルに実行権限があることを確認してください。 スクリプトを実行するときに何を使用するかをシステムに伝えます(例:#!/bin/shを先頭に置く) cronの日付に関連するバグ日付がユーザーまたはシステムの更新、タイムゾーンなどによって最近変更された場合、crontabは不規則に動作し始め、奇妙なバグを示します。これは、下から時刻が変わったときに「やりたいことをしよう」とするcrontabの試みです。 「分」フィールドは、時間を変更すると無効になります。このシナリオでは、アスタリスクのみが受け入れられます。 cronを再起動し、インターネットに接続せずに再試行します(日付がタイムサーバーの1つにリセットする機会がありません)。パーセント記号、再びパーセント記号に関するアドバイスを強調するために、cronがパーセント記号を使って行う例を次に示します。# cron entry * * * * * cat >$home/cron.out%foo%bar%baz 3行を含む〜/ cron.outファイルを作成しますfoo bar baz これは、dateコマンドを使用する場合に特に邪魔になります。パーセント記号は必ずエスケープしてください* * * * * /path/to/command --day "$(date "+\%y\%m\%d")"