crontabに関連するすべての問題/問題を修正する方法(Linux)
これはコミュニティWikiです。この回答に誤りがある場合、または追加情報がある場合は編集してください。
まず、基本的な用語:
次に、cronに関する教育:
システム上のすべてのユーザーは、独自のcrontabファイルを持つことができます。ルートおよびユーザーcrontabファイルの場所はシステムに依存しますが、通常は以下にあります/var/spool/cron
。
システム全体の/etc/crontab
ファイルがあり、/etc/cron.d
ディレクトリにはcrontabフラグメントが含まれている場合があり、crontabフラグメントもcronによって読み取られ、アクションが実行されます。一部のLinuxディストリビューション(Red Hatなど)/etc/cron.{hourly,daily,weekly,monthly}
には、ディレクトリ、スクリプト、およびその中のスクリプトが1時間/日/週/月ごとにルート権限で実行されるものもあります。
rootは常にcrontabコマンドを使用できます。通常のユーザーにはアクセスが許可される場合と許可されない場合があります。コマンドでcrontabファイルを編集してcrontab -e
保存すると、crondは基本的な有効性を確認しますが、crontabファイルが正しく形成されていることを保証しません。cron.deny
どのユーザーがcronを使用できないかを指定するというファイルがあります。cron.deny
ファイルの場所はシステムに依存し、すべてのユーザーがcronを使用できるようになりますどの削除することができます。
コンピューターの電源が入っていないか、crondデーモンが実行されておらず、コマンドの実行日時が過ぎている場合、crondは過去のクエリをキャッチアップして実行しません。
crontabの詳細、コマンドの定式化方法:
crontabコマンドは1行で表されます。\
コマンドを複数行にわたって拡張することはできません。ハッシュ(#
)記号はコメントを表し、その行のすべてがcronによって無視されます。先頭の空白と空白行は無視されます。
%
コマンドでパーセント記号()を使用するときは、十分に注意してください。エスケープ\%
されない限り、それらは改行に変換され、最初のエスケープされていないものが%
標準入力のコマンドに渡されます。
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,7,12,17,22 ...)を開始することを意味ステップ例えば2/5を導入するために使用することができます。彼らは終わりを超えてラップしません。
*
フィールド内のアスタリスク()は、そのフィールドの範囲全体を示します(たとえば0-59
、分フィールド)。
- 範囲と手順を組み合わせることができます。たとえば
*/2
、関連するフィールドの最小値から始まり、2分ごとに0を意味します。たとえば、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が使用しているシェルによって異なる場合があります。以下に、すべての出力をファイルに保存する2つの例を示します/tmp/mycommand.log
。
1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1
ログを見てください
Cronは、syslogを介してアクションをログに記録します。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=/usr:/usr/bin:/path/to/something/else
1 2 * * * command
コマンドに他の環境変数が必要な場合は、crontabファイルでも定義できます。
cronは、cwd == $ HOMEでコマンドを実行します
実行するプログラムがファイルシステムのどこに存在するかに関係なく、cronが実行されるときのプログラムの現在の作業ディレクトリは、ユーザーのホームディレクトリになります。プログラム内のファイルにアクセスする場合、相対パスを使用する場合、または(できれば)あらゆる場所で完全修飾パスを使用する場合、これを考慮する必要があります。
crontabの最後のコマンドが実行されない
Cronでは、通常、コマンドを改行で終了する必要があります。crontabを編集します。最後のコマンドを含む行の最後に移動して、新しい行を挿入します(Enterキーを押します)。
crontab形式を確認してください
/ etc / crontabのユーザーcrontab形式のcrontabまたは/etc/cron.dのフラグメントを使用することはできません。ユーザー形式のcrontabでは、行の6番目の位置にユーザー名が含まれませんが、システム形式のcrontabではユーザー名が含まれ、そのユーザーとしてコマンドが実行されます。
/ etc / cronにファイルを置きます。{hourly、daily、weekly、monthly}実行しません
- ファイル名に拡張子がないことを確認してくださいrun-parts
- ファイルに実行権限があることを確認してください。
- スクリプトを実行するときに何を使用するかをシステムに指示します(例:
#!/bin/sh
先頭に配置)
Cron日付関連のバグ
ユーザーまたはシステムの更新、タイムゾーンなどによって日付が最近変更された場合、crontabは不規則に動作し始め、奇妙なバグを示します。これは、その下から時間が変わったときに「望むことをする」ことを試みるcrontabの試みです。「分」フィールドは、時間が変更されると無効になります。このシナリオでは、アスタリスクのみが受け入れられます。cronを再起動し、インターネットに接続せずに再試行します(したがって、タイムサーバーのいずれかに日付をリセットする機会はありません)。
パーセント記号、再び
パーセント記号に関するアドバイスを強調するために、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")"