この記事、結構前に書いたやつだから、書き方のクセが今と違ってて自分でもちょっと違和感あるかも
crontabコマンドを使うと、決まった時間の間隔で特定のシステムコマンドやshellスクリプトを実行できるんだ。時間の間隔は、分、時、日、月、曜日、それらの組み合わせで自由に設定できるよ。
コマンドの形式
| |
コマンドの引数
- -u user:特定のユーザーのcrontabサービスを設定するために使う。
- file:コマンドファイルの名前。このファイルをcrontabのタスクリストとして読み込む。コマンドラインで指定しない場合は、標準入力(キーボード)からの入力を受け取ってcrontabに読み込むよ。
- -e:特定のユーザーのcrontabファイルの内容を編集する。ユーザーを指定しない場合は、現在のユーザーのファイルを編集するよ。
- -l:特定のユーザーのcrontabファイルの内容を表示する。指定しない場合は現在のユーザーのものを表示するよ。
- -r:/var/spool/cron ディレクトリから特定のユーザーのcrontabファイルを削除する。指定しない場合は現在のユーザーのものが削除されるよ。
- -i:crontabファイルを削除する時に確認プロンプトを出す。
ファイル形式
crontab -e コマンドを実行すると、現在のユーザーの crontab ファイルが開くよ。このファイルの中で、# で始まる行はコメントになるんだ。
crontab ファイルでは、m h dom mon dow command という6つのフィールドで定時タスクを設定するよ。1行が1つのタスクに対応してるんだ。それぞれの意味はこんな感じ:
m:分 (minute) 1時間の中の何分目に実行するか。範囲は 0-59。
h:時 (hour) 1日の中の何時目に実行するか。範囲は 0-23。
dom:日 (day of month) 1ヶ月の中の何日目に実行するか。範囲は 0-31。
mon:月 (month) 1年の中の何ヶ月目に実行するか。範囲は 1-12。 月の英語名の最初の3文字で指定することもできるよ(大文字小文字は区別しない)。例えば january なら jan で指定可能。
dow:曜日 (day of week) 1週間の中の何曜日に実行するか。範囲は 0-7 で、0 と 7 はどちらも日曜日。 これも英語名の最初の3文字で指定できるよ(例:monday なら mon)。
command:具体的な操作
実行したい具体的なコマンドや、実行したいスクリプトのパスを指定するよ。
これら6つのフィールドはスペースで区切る必要があるんだ。すべてのフィールドに値を設定しなきゃいけなくて、省略はできないよ。5番目のフィールドより後の内容は、すべて6番目のフィールド(実行する操作)として扱われるんだ。
最初の5つのフィールドでは、以下の特殊文字を使って時間を指定できるよ:
- アスタリスク(*):すべての可能な値を表す。例えば、月フィールドがアスタリスクなら、他の条件が合えば毎月実行されるよ。
- カンマ(,):カンマで区切ってリストで指定できる。例えば、“1,2,5,7,8,9” みたいにね。
- ハイフン(-):整数をハイフンで繋いで範囲を指定できる。例えば “2-6” は “2,3,4,5,6” と同じ意味。
- スラッシュ(/):時間の**間隔(頻度)**を指定できる。例えば “0-23/2” は2時間ごとに実行。アスタリスクと組み合わせて
*/10と書けば、分フィールドなら10分ごとに実行っていう意味になるよ。
command フィールドでは、改行文字や % 文字を使ってコマンド内容を区切ることができるんだ。
最初の % より前の内容は実行のために shell に渡されて、% 自体は改行に置き換わるよ。% 以降、行末までの内容は標準入力として渡されるんだ。
もし % 文字そのものを使いたい時は、\% でエスケープしてね。
よく使う方法
cronプロセスにcrontabファイルを渡す前に、まずは環境変数 EDITOR を設定しておこう。cronはこの変数を見て、どのエディタでcrontabファイルを編集するか決めるんだ。
デフォルトの nano エディタが使いにくい場合は、vi に変更できるよ。$HOME ディレクトリの .profile ファイルを編集して、こんな一行を追加してみて:
| |
保存して終了したら準備OK。例えば <user>cron(ユーザー名が yexca なら yexcacron)っていう名前のファイルを作って、そこに実行したい内容を書いてみよう。
| |
この例では、15分ごとに現在の時刻がコンソールに出力されるよ。システムがクラッシュしたり止まったりした時に、最後に表示された時間を見ればいつ止まったかすぐ分かるんだ。システムによっては tty1 がコンソールになってることもあるから、環境に合わせて適宜書き換えてね。作ったファイルを登録するには、そのファイルを引数にして crontab コマンドを実行すればいいよ:
| |
これで cron プロセスに登録されて、15分ごとに実行されるようになるんだ。同時に、このファイルのコピーが /var/spool/cron ディレクトリにユーザー名(この場合は yexca)で保存されるよ。
スクリプトの実行
スクリプトを実行する時に環境変数を使いたい場合は、こんな感じで書くよ:
| |
これは毎日 6:30 に zfile の restart.sh を実行する設定だね。
参考記事
crontab 定时任务 — Linux Tools Quick Tutorial
Linux技巧:介绍设置定时周期执行任务的方法 - SegmentFault 思否