Carpe Diem

備忘録。https://github.com/jun06t

cronで自動更新

以前アクセスログのとき用いたcronの使い方です。 前回は/cron.d/にファイルを置く形で更新させていましたが、今回はcrontabを用います。 まず $ crontab -l で現在のcron設定が表示されます。 これで出ない場合、cronを使用していないか、もしくは前回の僕のように直接/cron.d等にファイルを置いています。 では次にcrontabを編集します。 $ crontab -e 初回だとこの後にエディタの選択が表示されます。僕の場合はEmacsを使うのでそれを選択。viやvimユーザの人はviを選択すれば良いと思います。 あとは前回と同じように編集するだけです。 # m h dom mon dow command */30 * * * * svn up /home/user/public_html/ > /dev/null 2>&1 これで30分ごとにsvn upを実行してくれます。注意として最後に改行を入れないと保存が出来ません。 後半はリダイレクトを用いたメッセージの破棄処理です。要らないmailが飛んでこないようにするためなどに書く~と言われています。詳しくは補足で説明します。 ◆cronが動いているかどうかの確認 $ /etc/init.d/cron staus Rather than invoking init scripts through /etc/init.d, use the service(8) utility, e.g. service cron status Since the script you are attempting to invoke has been converted to an Upstart job, you may also use the status(8) utility, e.g. status cron cron start/running, process 1236 これで上記のようにプロセス番号が表示されたら起動してます。 動いていない場合は $ sudo /etc/init.d/cron start 再起動は $ sudo /etc/init.d/cron restart cronに関係するログは/var/log/syslogに書き込まれます。 cronが正しく実行されていると以下のような記述がある筈です。cronの実行時間と比較してみてください。 Jan 16 21:10:01 lily CRON[4062]: (user) CMD (svn up /home/user/public_html/ > /dev/null 2>&1) このような記述があればちゃんと動いています。 ◆cronの書き方色々 順番は [分] [時] [日] [月] [曜日] [ユーザー] [コマンド] です。以下設定例。
33 14 * * *               14:33に実行(毎日)
15 06 * * *             6:15に実行(毎日)
0 16 * * *                16:00に実行(毎日)
0 04 * * 1                (月)の午前4:00に実行(毎週)
0,10 19 * * 0,2,3         (日)(火)(水)の19:00と19:10に実行(毎週)
0-10 14 1 * *             1日の14:00から14:10まで1分ごとに実行(毎月)
0 0 1,15 * 1              1日と15日と(月)の 0:00に実行(毎月)
42 4 25 * *             25日の4:42に実行(毎月)
0 21 * * 1-6            (月)〜(土)まで21:00に実行(日曜を除く)
0,10,20,30,40,50 * * * * 10分おきに実行(毎時)
*/10 * * * *        10分おきに実行(毎時)
* 1 * * *         1:00から1:59まで1分おきに実行(毎日)
0 4 * * *         4:00に実行(毎日)
0 */1 * * *        0分に1時間おきに実行(毎時)
0 * * * *         0分に1時間おきに実行(毎時)
2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02に実行(8:00から20:00まで3時間おきに実行)
30 5 1,15 * *       1日と15日の5:30に実行
◆キーワードで記述 @reboot date >> ~/startup.log のようにキーワードで記述することもできます。主なキーワードは以下です。
キーワード機能
@reboot起動時に1度だけ実行
@yearly1年に1度だけ実行(「0 0 1 1 *」と同等)
@annually@yearlyと同じ
@monthly1カ月に1度だけ実行(「0 0 1 * *」と同等)
@weekly1週間に1度だけ実行(「0 0 * * 0」と同等)
@daily1日に1度だけ実行(「0 0 * * *」と同等)
@hourly1時間に1度だけ実行(「0 * * * *」と同等)
◆補足 シェルコマンドの 2>&1 は何を意味しているか。 Unix ではファイル記述子というのがあって、番号、多くの場合 0, 1, 2 が使われます。0は入力、1は普通のメッセージ出力、2はエラーメッセージの出力というように使い分けされています。 command > /dev/null という部分は、command の普通のメッセージ(ファイル記述子1番)を /dev/null というファイル(このファイルは特殊で、ここに出力された内容は全て捨てられます)に出力されます。で、残る "2>&1" という部分ですが、これは2番のファイル記述子を1番というファイル記述子にする、という意味になります。 従って、"command > /dev/null 2>&1" とすることで command からの全てのメッセージは(/dev/nullに)捨てられる、つまり、エラーがあろうがなかろうが出力されるメッセージは何もないことになります。 注意として、書き順を逆にしないようにしてください。リダイレクトは左側から評価されるので、最初に command > /dev/null が評価され、標準出力が/dev/nullを指すようになります。 続いて、 2>&1 が評価されて、標準エラー出力が標準出力の複製となります。 簡単な例として $ ls >/dev/null 2>&1 とすると、いつもなら表示されるリストがこの場合は表示されなくなります。 ◆自動シャットダウン 30 21 * * * /sbin/shutdown -h now 普通にshutdown -h nowではダメでした。ちょっと注意 ソース: crontabの使い方 シェルのリダイレクトにまつわる失敗 >/dev/null 2>&1をちゃんと考える