Crontabコマンドの注意点
SSHリモート端末で「crontab」コマンドをノックした後、リモート接続がいくつかの原因(例えば、悪いネットワーク、プログラム異常)で意外に終了すると、Crontab計画タスクはオペレーティングシステムによってクリアされます.不思議に聞こえますが、仮想マシンで何度もテストした結果、確かに発生しました.テスト方法は、SecureCRTでSSHウィンドウを開き、コマンド「crontab」をタップし、「タスクマネージャ」でSecureCRTプロセスを直接殺し、別のSSHウィンドウで「crontab-l」を実行すると、すべての計画タスクが存在しないことがわかります.
crontab -l > crontab.txt vi crontab.txt crontab crontab.txt
2.crontabと環境変数は、cronが必要な特殊な環境を知っていると仮定しないでください.実際には知りません.自動設定されたグローバル変数を除いて、shelllスクリプトに必要なすべてのパスと環境変数を提供することを保証します.したがって、1)スクリプトにファイルパスが含まれている場合にグローバルパスを書く.2)スクリプト実行javaまたは他の環境変数を使用する場合、cat start_などの環境変数をsourceコマンドで導入します.cbp.sh #!/bin/sh source/etc/profile export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf/usr/local/jboss-4.0.5/bin/run.sh-c mev&3)手動でスクリプトを実行してOKであるがcrontabが死活して実行しない場合.この場合,環境変数が引き起こした災いであることを大胆に疑い,crontabに環境変数を直接導入して問題を解決することを試みる必要がある.次のようになります.
0 * * * * ./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh 3. その他注意すべき問題1)新しく作成されたcron jobは、すぐに実行されず、少なくとも2分後に実行されます.cronを再起動するとすぐに実行されます.2)ジョブ毎に実行が完了すると、現在のシステムユーザに出力メールが自動的に送信される.積み重ねて、とても多くて、甚だしきに至っては全体のシステムを爆発させます.したがって,各JOBコマンドの後にリダイレクト処理を行う必要がある:>/dev/null 2>&1.ジョブのコマンドを正常に出力する必要があることを前提として、特定のログファイルに追加するなど、一定の処理が行われています.3)crontabが突然失効した場合、/etc/initを試みることができる.d/crond restart問題を解決します.または、jobがtail-f/var/log/cronを実行/エラーしているかどうかをログで確認します.
4)crontab-rをむやみに運転しないでください.Crontabディレクトリ(/var/spool/cron)からユーザーのCrontabファイルを削除します.このユーザーを削除したcrontabはすべてなくなりました.5)crontabでは%が特別な意味を持ち、改行の意味を表す.もし使うならば%をエスケープしなければならなくて、もしいつも使うdate'+%Y%m%d'はcrontabの中で実行しないならば、date'+%Y%m%d`に変えるべきです.
附:CRON用法:
cronサービスはlinuxの内蔵サービスですが、自動的に起動しません.次のコマンドを使用して、サービスを開始および停止できます.
上記の1~4行は、サービスの起動、停止、再起動、再ロードの構成です.
cronを起動時に自動的に起動するように設定するには、/etc/rc.d/rc.localスクリプトに
cronはコマンドラインをcrontab(cron table)ファイルに保存します.このファイルは通常/etcディレクトリの下にあります.各システムユーザーは、/var/spool/cron/の下に独自のcrontabを持つことができます.現在のユーザーのcrontabを表示するには、crontab-lを入力します.crontabを編集するには、crontab-eを入力します.crontabを削除するには、crontab-rを入力します.現在rootアイデンティティである場合、ユーザーのcrontabを表示/編集/削除するには、対応するコマンドの後に-u USERNAME(crontab-e-u USERNAMEなど)を付けるだけです.crontabファイルのデフォルトエディタはviで、export VISUAL='editor'を入力してデフォルトエディタを変更できます.
cronサービスは毎分/var/spool/cronディレクトリ内のすべてのファイルだけでなく、/etc/crontabファイルも1回読む必要があります.このファイルを構成してもcronがタスクを実行できます.crontabコマンドを使用すると、ユーザー・レベルのタスクの構成であり、編集/etc/crontabファイルはシステム・レベルのタスクの構成です.
以下に、2つのcron文の例を示します(/etc/crontabファイル).前者は夜間に/etcディレクトリをバックアップし,後者はAnalylogプログラムを実行してサーバの統計を処理する.
次はcron文のフィールドとフィールドの説明です.
フィールド
説明
1
分(0-59)
2
時間(0~23)
3
日付(1-31)
4
月(1-12;または英語略称Jan、Febなど)
5
曜日(0-6、0は日曜日、またはSun、Monなど)
6
ユーザー名(コマンド実行時にこのユーザーとして)
7
実行するコマンド(パス)
最初の行を見てみましょう.
この文は、毎日午前3時12分(03:12)に
この文は少し複雑になります.
6月13日月曜日の15:30に
次の文は、同じ効果を達成します.
ユーザーjoeyとして1時間の15分目にプログラムを実行したい場合は、次の操作を行います.
アスタリスク(*)はワイルドカードで、cronがこのフィールドを無視することを示します.
2時間ごとにプログラムを実行したい場合は、時間フィールドで
cron文では、カンマ(,)を使用して複数の時間を指定することもできます.たとえば、1時間あたり15分と30分にプログラムを実行したい場合は、分フィールドで
プログラムを毎月の最初の週(1日から7日まで)の毎日の指定時間に実行したい場合は、日付フィールドで
この文は、毎月1~7日の2時間ごとに15分と30分(02:15、02:30…22:15、22:30など)に
毎日16:18に1つのスクリプトセットを実行したい場合は、/home/username/cronなど、実行するすべてのスクリプトを1つのディレクトリに配置して使用できます.
プログラムの出力結果を保存したい場合は、
現在のユーザーのcron構成を表示し、crontab-l を使用します.現在のユーザのcron構成を編集し、crontab-e を使用する現在のユーザのcron構成を削除し、crontab-r を使用する. rootとしてユーザーのcron構成を表示/編集/削除し、コマンド後に-u USERNAME を追加システムレベルのタスクを構成し、/etc/crontabファイル を編集します.
crontab -l > crontab.txt vi crontab.txt crontab crontab.txt
2.crontabと環境変数は、cronが必要な特殊な環境を知っていると仮定しないでください.実際には知りません.自動設定されたグローバル変数を除いて、shelllスクリプトに必要なすべてのパスと環境変数を提供することを保証します.したがって、1)スクリプトにファイルパスが含まれている場合にグローバルパスを書く.2)スクリプト実行javaまたは他の環境変数を使用する場合、cat start_などの環境変数をsourceコマンドで導入します.cbp.sh #!/bin/sh source/etc/profile export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf/usr/local/jboss-4.0.5/bin/run.sh-c mev&3)手動でスクリプトを実行してOKであるがcrontabが死活して実行しない場合.この場合,環境変数が引き起こした災いであることを大胆に疑い,crontabに環境変数を直接導入して問題を解決することを試みる必要がある.次のようになります.
0 * * * * ./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh 3. その他注意すべき問題1)新しく作成されたcron jobは、すぐに実行されず、少なくとも2分後に実行されます.cronを再起動するとすぐに実行されます.2)ジョブ毎に実行が完了すると、現在のシステムユーザに出力メールが自動的に送信される.積み重ねて、とても多くて、甚だしきに至っては全体のシステムを爆発させます.したがって,各JOBコマンドの後にリダイレクト処理を行う必要がある:>/dev/null 2>&1.ジョブのコマンドを正常に出力する必要があることを前提として、特定のログファイルに追加するなど、一定の処理が行われています.3)crontabが突然失効した場合、/etc/initを試みることができる.d/crond restart問題を解決します.または、jobがtail-f/var/log/cronを実行/エラーしているかどうかをログで確認します.
4)crontab-rをむやみに運転しないでください.Crontabディレクトリ(/var/spool/cron)からユーザーのCrontabファイルを削除します.このユーザーを削除したcrontabはすべてなくなりました.5)crontabでは%が特別な意味を持ち、改行の意味を表す.もし使うならば%をエスケープしなければならなくて、もしいつも使うdate'+%Y%m%d'はcrontabの中で実行しないならば、date'+%Y%m%d`に変えるべきです.
附:CRON用法:
CRONサービスの起動と停止
cronサービスはlinuxの内蔵サービスですが、自動的に起動しません.次のコマンドを使用して、サービスを開始および停止できます.
/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload
上記の1~4行は、サービスの起動、停止、再起動、再ロードの構成です.
cronを起動時に自動的に起動するように設定するには、/etc/rc.d/rc.localスクリプトに
/sbin/service crond start
を追加すればいいです.表示、編集、削除
cronはコマンドラインをcrontab(cron table)ファイルに保存します.このファイルは通常/etcディレクトリの下にあります.各システムユーザーは、/var/spool/cron/の下に独自のcrontabを持つことができます.現在のユーザーのcrontabを表示するには、crontab-lを入力します.crontabを編集するには、crontab-eを入力します.crontabを削除するには、crontab-rを入力します.現在rootアイデンティティである場合、ユーザーのcrontabを表示/編集/削除するには、対応するコマンドの後に-u USERNAME(crontab-e-u USERNAMEなど)を付けるだけです.crontabファイルのデフォルトエディタはviで、export VISUAL='editor'を入力してデフォルトエディタを変更できます.
cronサービスは毎分/var/spool/cronディレクトリ内のすべてのファイルだけでなく、/etc/crontabファイルも1回読む必要があります.このファイルを構成してもcronがタスクを実行できます.crontabコマンドを使用すると、ユーザー・レベルのタスクの構成であり、編集/etc/crontabファイルはシステム・レベルのタスクの構成です.
構文の説明
以下に、2つのcron文の例を示します(/etc/crontabファイル).前者は夜間に/etcディレクトリをバックアップし,後者はAnalylogプログラムを実行してサーバの統計を処理する.
12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
52 5 * * * root /usr/local/src/analog-5.32-lh/analog >> /dev/null 2>&1
次はcron文のフィールドとフィールドの説明です.
フィールド
説明
1
分(0-59)
2
時間(0~23)
3
日付(1-31)
4
月(1-12;または英語略称Jan、Febなど)
5
曜日(0-6、0は日曜日、またはSun、Monなど)
6
ユーザー名(コマンド実行時にこのユーザーとして)
7
実行するコマンド(パス)
最初の行を見てみましょう.
12 3 * * * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
この文は、毎日午前3時12分(03:12)に
tar czf /usr/local/backups/daily/etc.tar.gz /etc
コマンドを実行します.>> /dev/null 2>&1
は、すべての標準出力を/dev/null(linuxの回収局)に送信し、標準エラー出力(2)を標準出力(1)と同じ場所(すなわち/dev/null)に送信することを示す.このコマンドを実行しても、出力は発生しません.この文は少し複雑になります.
30 15 13 6 1 * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
6月13日月曜日の15:30に
tar czf /usr/local/backups/daily/etc.tar.gz /etc
コマンドを実行します.次の文は、同じ効果を達成します.
30 15 13 Jun Mon * root tar czf /usr/local/backups/daily/etc.tar.gz /etc >> /dev/null 2>&1
ユーザーjoeyとして1時間の15分目にプログラムを実行したい場合は、次の操作を行います.
15 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
アスタリスク(*)はワイルドカードで、cronがこのフィールドを無視することを示します.
2時間ごとにプログラムを実行したい場合は、時間フィールドで
*/2
を使用します.2時、4時、6時......22時、24時に実行されます.具体的な文は次のとおりです.
0 */2 * * * joey /usr/bin/somecommand >> /dev/null 2>&1
cron文では、カンマ(,)を使用して複数の時間を指定することもできます.たとえば、1時間あたり15分と30分にプログラムを実行したい場合は、分フィールドで
15,30
を使用します.
15,30 * * * * joey /usr/bin/somecommand >> /dev/null 2>&1
プログラムを毎月の最初の週(1日から7日まで)の毎日の指定時間に実行したい場合は、日付フィールドで
1-7
を使用します.
15,30 */2 1-7 * * joey /usr/bin/somecommand >> /dev/null 2>&1
この文は、毎月1~7日の2時間ごとに15分と30分(02:15、02:30…22:15、22:30など)に
/usr/bin/somecommand
コマンドを実行します.毎日16:18に1つのスクリプトセットを実行したい場合は、/home/username/cronなど、実行するすべてのスクリプトを1つのディレクトリに配置して使用できます.
18 16 * * * root run-parts /home/username/cron >> /dev/null 2>&1
プログラムの出力結果を保存したい場合は、
>> /dev/null 2>&1
を>> /home/user/somecommand.log 2>&1
に置き換えることができます.