Product SiteDocumentation Site

9.7. cronatd を使ったスケジューリングタスク

cron は定期的に (毎日、毎週、など) 実行するよう予定されたコマンドの実行を担当しているデーモンです。さらに atd は未来の特定の時間に 1 回だけ実行するよう予定されたコマンドの実行を担当しているデーモンです。
Unix システムでは、多くのタスクが定期的に実行されるよう予定されています。
デフォルトで、すべてのユーザはタスク実行の予定を入れることが可能です。各ユーザは自分専用の crontab を持っており、これを使ってコマンド実行の予定を登録することが可能です。crontab を編集するには crontab -e を実行します (/var/spool/cron/crontabs/user ファイルに保存されます)。
root ユーザは自分専用の crontab を持っていますが、/etc/crontab ファイルを使ったり、追加的な crontab ファイルを /etc/cron.d ディレクトリに置くことが可能です。最後の 2 つの解決策には、コマンドを実行する際に実行するユーザを明示できるという利点があります。
デフォルトで cron パッケージには、いくつかのスケジュール済みコマンドが含まれています。
多くの Debian パッケージはこのサービスに頼っています。すなわち、メンテナンススクリプトをこれらのディレクトリに入れて、サービスの最適な動作を保証しています。

9.7.1. crontab ファイルの書式

crontab の有効な各行は以下の 6 つ (または 7 つ) のフィールドを含むスケジュールされたコマンド表します。
  • 分 (0 から 59 までの数字を指定します)。
  • 時間 (0 から 23 までの数字を指定します)。
  • 月の日付 (1 から 31 までの数字を指定します)。
  • 月 (1 から 12 までの数字を指定します)。
  • 曜日 (0 から 7 までの数字、月曜日は 1、日曜日は 0 と 7 の両方、さらに英語で書いた曜日の最初の 3 文字 SunMon などを使うことも可能です)。
  • コマンドを実行するユーザ名 (/etc/crontab ファイルと /etc/cron.d/ にある分割されたファイルでは必要ですが、各ユーザ専用のファイルでは不要です)。
  • 実行するコマンド (最初の 5 つのフィールドで定義された条件が満足されたら実行します)。
すべての詳細は crontab(5) man ページに書かれています。
各値は設定できる値の (コンマ区切り) リストの形で表現することが可能です。a-b 構文は ab の間にあるすべての値を表現します。a-b/c 構文は a から c ずつ増加させて b までのすべての値を表現します (たとえば 0-10/20,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

9.7.2. 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/1512/25/2015 は 2015 年 12 月 25 日を意味します)、または単純な MMDD[CC]YY (12251512252015 は同様に 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 には minuteshoursdaysweeks を指定することが可能です。number は単純に period で指定した単位の量を表し、この量だけコマンドの実行が延期されます。
cron でスケジュールされたタスクを中止するには、単純に crontab -e を実行し、crontab ファイルから対応する行を削除してください。at タスクの場合、削除はとても簡単です。すなわち atrm task-number を実行してください。タスク番号は at コマンドで予定を登録した際に表示されたものです。改めて確認するには atq コマンドを実行してください。これはスケジュールされたタスクの現在のリストを表示します。