9.7. cron と atd を使ったスケジューリングタスク
cron は定期的に (毎日、毎週、など) 実行するよう予定されたコマンドの実行を担当するデーモンです; atd は未来の特定の時間に 1 回だけ実行するよう予定されたコマンドの実行を担当するデーモンです。
Unix システムでは、多くのタスクがは定期的に実行されるよう予定されています:
デフォルトで、全てのユーザはタスク実行の予定を入れることが可能です。各ユーザは自分専用の crontab を持っており、これを使ってコマンド実行の予定を登録することが可能です。crontab を編集するには crontab -eを実行します (/var/spool/cron/crontabs/user ファイルに保存されます)。
root ユーザは自分専用の crontab を持っていますが、/etc/crontab ファイルを使ったり、追加的な crontab ファイルを /etc/cron.d ディレクトリに置くことが可能です。最後の 2 つの解決策には、コマンドを実行する際に実行するユーザを明示できるという利点があります。
デフォルトで cron パッケージには、幾つかのスケジュールされたコマンドが含まれています:
/etc/cron.hourly/ ディレクトリ内のプログラムは 1 時間に 1 回実行されます;
/etc/cron.daily/ ディレクトリ内のプログラムは 1 日に 1 回実行されます;
/etc/cron.weekly/ ディレクトリ内のプログラムは 1 週間に 1 回実行されます;
/etc/cron.monthly/ ディレクトリ内のプログラムは 1 ヶ月に 1 回実行されます。
多くの Debian パッケージはこのサービスに頼っています: メンテナンススクリプトをこれらのディレクトリに入れて、サービスの最適な動作を保証しています。
crontab の有効な各行は以下の 6 つ (または 7 つ) のフィールドを含むスケジュールされたコマンド表します:
分 (0 から 59 までの数字)
時間 (0 から 23 までの数字);
月の日付 (1 から 31 までの数字);
月 (1 から 12 までの数字);
曜日 (0 から 7 までの数字、月曜日は 1、日曜日は 0 と 7 の両方; 英語で書いた曜日の最初の 3 文字 Sun、Mon などを使うことも可能です);
コマンドを実行するユーザ名 (/etc/crontab ファイルと /etc/cron.d/ にある分割されたファイルでは必要。各ユーザ専用のファイルでは不要);
実行するコマンド (最初の 5 つのフィールドで定義された条件が満足されたら実行します)。
全ての詳細は crontab(5) man ページに書かれています。
各値は設定可能な値の (コンマ区切り) リストの形で表現することが可能です。a-b 構文は a と b の間にある全ての値を表現します。a-b/c 構文は a から c づつ増加させて b までの全ての値を表現します (例: 0-10/2 は 0,2,4,6,8,10 を意味します)。アスタリスク * はワイルドカードで、とり得るすべての値を意味します。
例9.2 単純な crontab ファイル
#Format
#min hour day mon dow command
# Download data every night at 7:25 pm
25 19 * * * $HOME/bin/get.pl
# 8:00 am, on weekdays (Monday through Friday)
00 08 * * 1-5 $HOME/bin/dosomething
# Restart the IRC proxy after each reboot
@reboot /usr/bin/dircproxy
at は未来の特定の時点にコマンドを実行します。at は時刻と日付をコマンドラインパラメータで受け取り、実行するコマンドを標準入力で受け取ります。このコマンドは、あたかも現在のシェルで実行されたかの如く実行されます。at はコマンドを実行する際に現在と同じ状況を再現するために、現在の環境を保存するように気を付けます。時刻は以下のように普通の慣例に従って表現されます: 16:12 または 4:12pm は午後 4:12 を意味します。日付はヨーロッパと西洋で使われる幾つかの書式で指定します。DD.MM.YY (27.07.12 は 2012 年 7 月 27 日を意味します)、YYYY-MM-DD (2012-07-27 は上と同じ日付を意味します)、MM/DD/[CC]YY (12/25/12 や 12/25/2012 は 2012 年 12 月 25 日を意味します)、または単純な MMDD[CC]YY (122512 や 12252012 は同様に 2012 年 12 月 25 日を意味します) などです。日付の指定がなければ、コマンドは最も早く到達した指定時刻に実行されます (当日中、または、指定時刻が既に過ぎていれば明日)。読んで字の通り「today」、「tomorrow」などと簡単に書くことも可能です。
$ at 09:00 27.07.14 <<END
> echo "Don't forget to wish a Happy Birthday to Raphaël!" \
> | mail lolando@debian.org
> END
warning: commands will be executed using /bin/sh
job 31 at Fri Jul 27 09:00:00 2012
与えられた期間だけ実行を延期する構文もあります: at now + number period です。period には minutes、hours、days、weeks を指定することが可能です。number は単純に period で指定した単位の量を表し、この量だけコマンドの実行が延期されます。
cron でスケジュールされたタスクを中止するには、単純に crontab -eを実行し、crontab ファイルから対応する行を削除してください。at タスクの場合、削除はとても簡単です: atrm task-number を実行してください。タスク番号は at コマンドで予定を登録した際に表示されたものです。改めて確認するには atq コマンドを実行してください。これはスケジュールされたタスクの現在のリストを表示します。