9.7. cron
と atd
を使ったスケジューリングタスク
cron
は定期的に (毎日、毎週など) 実行するよう予定されたコマンドの実行を担当しているデーモンです。また、atd
は未来の特定の時間に 1 回だけ実行するよう予定されたコマンドの実行を担当しているデーモンです。
Unix システムでは、以下に挙げる多くのタスクが定期的に実行されるよう予定されています。
デフォルトで、すべてのユーザはタスク実行の予定を入れることが可能です。各ユーザは自分専用の crontab を持っており、これを使ってコマンド実行の予定を登録することが可能です。crontab を編集するには crontab -e
を実行します (crontab は /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 パッケージは cron のサービスに頼っています。すなわち、メンテナンススクリプトをこれらのディレクトリに入れて、サービスの最適な動作を保証しています。
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
ファイル
#フォーマット
#分 時 日付 月 曜日 コマンド
# 毎日深夜午前 7 時 25 分にデータをダウンロード
25 19 * * * $HOME/bin/get.pl
# 平日 (月曜日から金曜日) 午前 8 時 0 分
00 08 * * 1-5 $HOME/bin/dosomething
# 起動直後に IRC プロキシを再始動
@reboot /usr/bin/dircproxy
at
は未来の特定の時点にコマンドを実行します。at
は時刻と日付をコマンドラインパラメータで受け取り、実行するコマンドを標準入力で受け取ります。at
を使って実行予約を登録したコマンドはあたかも at
を実行した現在のシェルで実行されたかのように実行されます。at
はコマンドを実行する際に現在と同じ状況を再現するために、現在の環境を保存するように気を付けます。時刻は以下のように普通の慣例に従って表現されます。すなわち 16:12
または 4:12pm
は午後 4 時 12 分を意味します。日付はヨーロッパと西洋で使われるいくつかの書式で指定します。DD.MM.YY
(27.07.15
は 2015 年 7 月 27 日を意味します)、YYYY-MM-DD
(2015-07-27
は上と同じ日付を意味します)、MM/DD/[CC]YY
(12/25/15
や 12/25/2015
は 2015 年 12 月 25 日を意味します)、または単純な MMDD[CC]YY
(122515
や 12252015
は同様に 2015 年 12 月 25 日を意味します) などです。日付の指定がなければ、コマンドは最も早く到達した指定時刻に実行されます (当日、または指定時刻が既に過ぎていれば明日に実行されます)。読んで字の通り「today」(今日)、「tomorrow」(明日) などと簡単に書くことも可能です。
$
at 09:00 27.07.15 <<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 Mon Jul 27 09:00:00 2015
与えられた期間だけ実行を先延ばしにする構文もあります。たとえば at now + number period
です。period には minutes
、hours
、days
、weeks
を指定することが可能です。number は単純に period で指定した単位の量を表し、この量だけコマンドの実行が先延ばしされます。
cron
でスケジュールされたタスクを中止するには、単純に crontab -e
を実行し、crontab ファイルから対応する行を削除してください。at
タスクの場合、削除はとても簡単です。すなわち atrm task-number
を実行してください。タスク番号は at
コマンドで予定を登録した際に表示されたものです。もう一度確認するには atq
コマンドを実行してください。これはスケジュールされたタスクの現在のリストを表示します。