この章では、crontab および at コマンドを使用して、ルーチンまたは 1 度限りのシステムイベントをスケジュールする方法を示します。さらに、cron.deny、cron.allow、at.deny の各ファイルを使用して、これらのコマンドへのアクセスを制御する方法も説明します。
この章で説明する手順は次のとおりです。
システムイベントは、crontab コマンドを使用して定期的に繰り返し実行するようにスケジュールできます。また、at コマンドを使用して、特定のシステムイベントを指定の時刻に実行するようにスケジュールすることもできます。表 59-1 に crontab、at の他に、これらのコマンドへのアクセスを制御できるファイルを示します。
表 59-1 システムイベントのスケジューリング用コマンド
コマンド |
スケジューリングの対象 |
ファイルの格納場所 |
アクセス制御用ファイル |
---|---|---|---|
crontab |
一定間隔で実行する複数のシステムイベント |
/usr/spool/cron/crontabs または /var/spool/cron/crontabs |
/etc/cron.d/cron.allow と /etc/cron.d/cron.deny |
at |
1 つのシステムイベント |
/usr/spool/cron/atjobs または /var/spool/cron/atjobs |
/etc/cron.d/at.deny |
以降の各項で、crontab ファイルをどのように作成、編集、表示、削除するか、さらに、それらのファイルへのアクセスをどのように制御するかを説明します。
cron デーモンは、各 crontab ファイル内にあるコマンドに従ってシステムイベントをスケジュールします。crontab ファイルには、それぞれ一定間隔で実行されるコマンドが 1 行に 1 つずつ入っています。各行の先頭は cron デーモンが各コマンドを実行する日時情報です。
たとえば、SunOS ソフトウェアのインストール時に root という名前の crontab ファイルが提供されますが、このファイルの内容は次のとおりです。
0 20 * * 0,4 /etc/cron.d/logchecker 5 4 * * 0 /usr/lib/newsyslog 15 3 * * * /usr/lib/fs/nfs/nfsfind 1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
最初のコマンド行は、日曜日と木曜日の午後 10 時に logchecker を実行するようシステムに指示します。2 番目のコマンド行は、毎日曜日の午前 4 時 5 分に newsyslog を実行するようにシステムをスケジュールします。3 番目のコマンド行は毎日午前 3 時 15 分に nfsfind を実行するようにシステムに指示します。4 番目のコマンド行は、夏時間をチェックして、必要であれば修正するようにシステムに指示します。RTC タイムゾーンも /etc/rtc_config ファイルもない場合、このエントリは何もしません。
crontab ファイル内のコマンド行の構文の詳細については、「crontab ファイルエントリの構文」を参照してください。
crontab ファイルは /usr/spool/cron/crontabs (または、/var/spool/cron/crontabs) に格納されます。SunOS ソフトウェアのインストール時には、root 以外にもいくつかの crontab ファイルが提供されます (表 59-2 を参照してください)。
表 59-2 デフォルトの crontab ファイル
crontab ファイル |
機能 |
---|---|
adm |
アカウンティング |
lp |
印刷 |
root |
一般的システム機能と ファイルシステムの整理 |
sys |
性能情報の収集 |
その他の crontab ファイルは、それらの中に作成されるユーザーのアカウントに基づいて、bob、mary、smith、jones などのように命名されます。
デフォルトの crontab ファイルの他に、ユーザーは crontab ファイルを作成してそれぞれユーザー自身のシステムイベントをスケジュールできます。root または他のユーザーが所有する crontab ファイルにアクセスするには、スーパーユーザーの特権が必要です。
crontab ファイルを作成、編集、表示、削除する手順については、「システムイベントのスケジューリング用コマンド」で説明します。
cron デーモンは crontab コマンドの自動スケジューリングを行います。このデーモンの機能は、通常 15 分おきに、/usr/spool/cron/crontabs ディレクトリ (または、システム構成によっては /var/spool/cron/crontabs ディレクトリ) を調べて crontab ファイルがないか確認します。新しい crontab ファイルがないか、既存の crontab が変更されていないかを確認し、いずれかがあった場合は、ファイル内のリストから実行時刻を読み取り、コマンドが正しい時刻に実行されるよう指示します。
ほとんど同様に、cron デーモンは /usr/spool/cron/atjobs ディレクトリ内の at ファイルのスケジューリングを制御します。
crontab ファイルは、1 行に 1 つのコマンドが入った構成になっています。これらのコマンド行の最初の 5 つのフィールドには、コマンドが実行される時刻を指定し、それぞれスペースで区切ります。表 59-3 にこれら 5 つのフィールドを示します。
表 59-3 crontab 時刻フィールドの値
時刻フィールド |
値 |
---|---|
分 |
0-59 |
時 |
0-23 |
日 |
1-31 |
月 |
1-12 |
曜日 |
0 - 6 (0 は日曜日) |
次に、crontab 時刻フィールドで特殊文字を使用する際のガイドラインを示します。
各フィールドはスペースで区切る。
複数の値の間はカンマで区切る。
値の範囲はハイフンを使用して指定する。
たとえば、次の crontab コマンドエントリの例は、毎月 1 日と 15 日の午後 4 時に、ユーザーのコンソールウィンドウに注意を促すメッセージを表示します。
0 16 1,15 * * echo Timesheets Due > /dev/console
crontab ファイル内の各コマンドは、長くても 1 行内に入れなければなりません。それは、crontab が 2 番目以降のキャリッジリターンを認識しないからです。(つまり、複数行とした場合は、同じコマンドとはみなされないということです。) crontab のエントリとコマンドオプションの詳細については、crontab(1) のマニュアルページを参照してください。
crontab ファイルの最も単純な作成方法は、crontab -e コマンドを使用して、EDITOR 環境変数によって定義されているテキストエディタを呼び出すものです。この変数を設定していない場合は、crontab はデフォルトのエディタ ed を使用します。EDITOR 環境変数に使い慣れたエディタを定義します。次の例は、エディタが定義されているかどうかを確認する方法と、vi をデフォルトとして設定する方法を示しています。
$ which $EDITOR $ $ EDITOR=vi $ export EDITOR
crontab ファイルを作成すると、自動的に /usr/spool/cron/crontabs ディレクトリ内に格納され、作成者のユーザー名が命名されます。スーパーユーザー特権があれば、他のユーザーや root の crontab ファイルを作成したり編集できます。
crontab コマンドエントリは、「crontab ファイルエントリの構文」の説明に従って入力してください。
エディタを使用できることを確認します。
(省略可能) root または他のユーザーが所有する crontab ファイルを作成または編集する場合は、スーパーユーザーになります。
次のように入力して、新しい crontab ファイルを作成するか、既存の crontab ファイルを編集します。
$ crontab -e [username]
username |
他のユーザーのアカウント名。作成したり編集するにはスーパーユーザー特権が必要。 |
誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込み文字キーを押してください。これで、変更結果を保存しないでエディタを終了できます。この時点でファイルをクローズして変更結果を保存すると、既存の crontab ファイルを空のファイルで上書きしてしまいます。
「crontab ファイルエントリの構文」で説明している構文に従って、コマンド行を crontab ファイルに追加します。
crontab ファイルをクローズして、変更結果を保存します。
crontab ファイルは /usr/spool/cron/crontabs に格納されます。
crontab -l コマンドを使用して、crontab ファイルを確認します。
# crontab -l [username]
次の例は、他のユーザーのための crontab ファイルをどのように作成するかを示します。
# crontab -e jones
新しい crontab ファイルに次のコマンドエントリを追加すると、毎日曜日の午前 1 時に、ユーザー jones のホームディレクトリから、すべてのログファイルが自動的に削除されます。このコマンドエントリは出力先を変更しないので、出力先変更文字がコマンド行の *.log の後に追加されて、そのコマンドが正しく実行されるようにしています。
# This command helps clean up user accounts. 1 0 * * 0 rm /home/jones/*.log > /dev/null 2>&1
特定のユーザーの crontab ファイルがあるかどうかを確認するには、/usr/spool/cron/crontabs ディレクトリで ls -l コマンドを使用します。たとえば、次の表示は、ユーザー smith と jones の crontab ファイルがあることを示しています。
$ ls -l /usr/spool/cron/crontabs -rw-r--r-- 1 root sys 190 Feb 26 16:23 adm -rw------- 1 root staff 225 Mar 1 9:19 jones -rw-r--r-- 1 root root 1063 Feb 26 16:23 lp -rw-r--r-- 1 root sys 441 Feb 26 16:25 root -rw------- 1 root staff 60 Mar 1 9:15 smith -rw-r--r-- 1 root sys 308 Feb 26 16:23 sys
ユーザーの crontab ファイルの内容を確認するには、crontab -l を使用します。「crontab ファイルを表示する方法」を参照してください。
crontab -l コマンドは、cat コマンドが他のファイルタイプの内容を表示するのとまったく同様に、使用しているユーザーの crontab ファイルの内容を表示します。このコマンドを使用するために、ディレクトリを (crontab ファイルが入っている) /usr/spool/cron/crontabs に変更する必要はありません。
デフォルトでは、crontab -l コマンドは自分自身の crontab ファイルを表示します。他のユーザーの crontab ファイルは、スーパーユーザーでなければ表示できません。
(省略可能) root または他のユーザーの crontab ファイルを表示する場合は、スーパーユーザーになります。
次のように入力して、crontab ファイルを表示します。
$ crontab -l [username]
username |
他のユーザーのアカウント名。作成したり編集するにはスーパーユーザー特権が必要。 |
誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込み文字キーを押してください。これで、変更結果を保存せずに crontab コマンドを終了できます。この時点でファイルを終了して変更結果を保存すると、既存の crontab ファイルが空のファイルで上書きされてしまいます。
次の例で、どのように crontab -l を使用してデフォルトユーザー、デフォルト root、他のユーザーの crontab ファイルを表示するかを示します。
$ crontab -l 13 13 * * * chmod g+w /usr/documents/*.book > /dev/null 2>&1 $ su Password: # crontab -l #ident "@(#)root 1.12 94/03/24 SMI" /* SVr4.0 1.1.3.1 */ # # The root crontab should be used to perform accounting data # collection. # # The rtc command is run to adjust the real time clock if and when # daylight savings time changes. # 0 2 * * 0,4 /etc/cron.d/logchecker 5 4 * * 6 /usr/lib/newsyslog 15 3 * * * /usr/lib/fs/nfs/nfsfind 1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 20 * * * * [ -x /usr/lib/inet/ntpdate ] && /usr/lib/inet/ntpdate -m 224.0.1.1 >/dev/null 2>&1 # crontab -l jones 13 13 * * * cp /home/jones/work_files /usr/backup/. > /dev/null 2>&1
デフォルトでは、誤って rm コマンドを使用して crontab ファイルを削除してしまうことがないように、crontab ファイルは保護されています。crontab ファイルを削除する場合は、crontab -r コマンドを使用してください。
デフォルトでは、crontab -r は自分自身の crontab を削除します。root またはその他のユーザーの crontab を削除するにはスーパーユーザーにならなければなりません。
このコマンドを使用するには、ディレクトリを (crontab ファイルが入っている) /usr/spool/cron/crontabs に変更する必要はありません。
(省略可能) root または他のユーザーの crontab ファイルを削除する場合は、スーパーユーザーになります。
次のように入力して、crontab ファイルを削除します。
$ crontab -r [username]
username |
他のユーザーのアカウント名。作成したり編集するにはスーパーユーザー特権が必要。 |
誤ってオプションを指定しないで crontab コマンドを入力した場合は、使用しているエディタの割り込み文字キーを押してください。それによって、変更結果を保存せずに crontab コマンドを終了できます。この時点でファイルを終了して変更結果を保存すると、既存の crontab ファイルが空のファイルで上書きされてしまいます。
crontab ファイルが削除されていることを確認します。
# ls /usr/spool/cron/crontabs
次の例で、crontab -r を使用してデフォルトユーザーの crontab ファイル、root、他のユーザーの各 crontab ファイルを削除する方法を示します。ls は正しい crontab ファイルが削除できたかどうかを確認します。
$ ls /usr/spool/cron/crontabs adm jones lp root smith sys $ crontab -r $ ls /usr/spool/cron/crontabs adm jones lp root sys $ su Password: # crontab -r # ls /usr/spool/cron/crontabs adm jones lp sys # crontab -r jones # ls /usr/spool/cron/crontabs adm lp sys
cron.deny と cron.allow という /etc/cron.d ディレクトリ内の 2 つのファイルを使用して、crontab へのアクセスを制御できます。これらのファイルによって、指定したユーザーだけが、それぞれ自分の crontab ファイルの作成、編集、表示、または削除などの crontab 関連操作を行うことができるようにします。
cron.deny および cron.allow ファイルは、それぞれ 1 行 に 1 ユーザー名が入ったリストからなります。これらのアクセス制御用ファイルは、次のように連携して機能を果たします。
cron.allow が存在しない場合は、cron.deny にリストされているユーザーを除くすべてのユーザーが crontab ファイルの実行を依頼できます。
cron.allow も cron.deny も存在しない場合は、root 以外は crontab を実行できません。
cron.deny と cron.allow を編集または作成するには、スーパーユーザーの特権が必要です。
Solaris ソフトウェアのインストール時に、デフォルトで次の cron.deny ファイルが提供されます。
$ cat /etc/cron.d/cron.deny daemon bin smtp nuucp listen nobody noaccess
上記のすべてのユーザーが、crontab コマンドにアクセスできません。このファイルを編集すれば、crontab コマンドへのアクセスを拒否したいユーザーの名前を追加できます。
デフォルトでは、cron.allow ファイルは提供されません。つまり、Solaris ソフトウェアのインストール後には、デフォルトの cron.deny ファイルにリストされているユーザー以外のユーザーすべてが crontab にアクセスできます。cron.allow ファイルを作成した場合、そのユーザーだけが crontab コマンドにアクセスできます。
スーパーユーザーになります。
エディタを使用して /etc/cron.d/cron.deny ファイルを編集し、crontab コマンドを使用させないユーザー名を次のように 1 行に 1 つずつ追加します。
daemon bin smtp nuucp listen nobody noaccess username1 username2 username3 . . .
/etc/cron.d/cron.deny ファイルを確認します。
# cat /etc/cron.d/cron.deny
エディタを使用して /etc/cron.d/cron.allow ファイルを作成します。
次のように、crontab コマンドの使用を許可するユーザー名を 1 行に 1 つずつ入力します。
root username1 username2 username3 . . .
このリストには必ず root を追加してください。追加しなければ、スーパーユーザーからの crontab コマンドへのアクセスが拒否されてしまいます。
/etc/cron.d/cron.allow ファイルをクローズして、変更結果を保存します。
次は、ユーザー visitor、jones、temp に crontab をアクセスさせない cron.deny ファイルの例です。
$ cat /etc/cron.d/cron.deny daemon bin smtp nuucp listen nobody noaccess jones temp visitor
次は cron.allow ファイルの例です。ユーザー smith、jones、lp、root だけが crontab にアクセスできます。
$ cat /etc/cron.d/cron.allow root jones lp smith
特定のユーザーが crontab にアクセスできるかどうかを確認するには、そのユーザーのアカウントにログインして、crontab -l コマンドを実行します。
$ crontab -l
そのユーザーが crontab にアクセスできて、すでに crontab ファイルを作成している場合は、その crontab ファイルが表示されます。そのユーザーが crontab にアクセスできるが、crontab ファイルがない場合は、次のようなメッセージが表示されます。
(crontab: crontab ファイルをオープンできません)
このユーザーは、cron.allow (が存在する場合) に含まれているか、または cron.deny に含まれていません。
ユーザーが crontab にアクセスできない場合は、上記の crontab ファイルがあってもなくても、次のメッセージが表示されます。
(crontab: cron を使用許可されていません)
これは、ユーザーが cron.allow (が存在する場合) に含まれていないか、または cron.deny ファイルに含まれていることを意味します。
以降で、at を使用してコマンドやスクリプトなどのジョブを後で特定の時刻に実行するようにスケジュールする方法と、それらのジョブを削除する方法、at へのアクセスを制御する方法を示します。
デフォルトでは、ユーザーはそれぞれ自分の at ジョブファイルを作成、表示、削除できます。root または他のユーザーの at ファイルにアクセスするには、スーパーユーザー特権が必要です。
at ジョブの実行を依頼すると、at ジョブにジョブ識別番号と .a 拡張子が与えられ、そのファイル名になります。
コマンド実行時刻を指定して at ユーティリティを起動します。
後で実行させるコマンドまたはスクリプトを入力します。
このコマンドまたはスクリプトからの出力が重要な場合は、後で調べられるように必ずファイルに書き込むようにしてください。
たとえば、次の at ジョブは、3 月 31 日の真夜中に Smith のユーザーアカウントから core ファイルを削除します。
$ at 11:45pm January 31 at> rm /home/smith/*core* at> Press Control-d job 852755100.a at Wed Jan 8 13:25:00 1997
特定のユーザーだけがそれぞれの at ジョブに関する待ち行列情報を作成、削除、または表示できるように、at コマンドへのアクセスを制御するファイルを設定できます。at へのアクセスを制御するファイルは /etc/cron.d/at.deny です。ここにはユーザー名が列挙 (1 行に 1 人) されています。このファイルに列挙されているユーザーは、at コマンドにアクセスできません。
Solaris ソフトウェアのインストール時に作成される at.deny ファイルには、次のユーザー名が含まれます。
daemon bin smtp nuucp listen nobody noaccess
スーパーユーザーの特権があれば、このファイルを編集して、at へのアクセスを制限したい他のユーザー名を追加できます。
次のように、自分のジョブを実行したい時刻を指定して at コマンドを入力し、Return キーを押します。
$ at [-m] time [date]
-m |
ジョブ終了後にメールを送る。 |
time |
ジョブをスケジュールしたい時刻の時単位の値。24 時間制を使用しない場合は、am または pm を追加する。midnight、noon、now はキーワードとして使用可能。分単位の値の指定は省略可能。 |
date |
月または曜日の名前の最初の 3 英字以上、またはキーワード today または tomorrow。 |
at プロンプトに、実行したいコマンドまたはスクリプトを 1 行に 1 つずつ入力します。各行の終わりで Return キーを押すことにより、複数のコマンドを入力できます。
at ユーティリティを終了し、Control-d を押して at ジョブを保存します。
作成できた at ジョブは待ち行列番号を割り当てられ、それがそのファイル名にもなります。この番号は at ユーティリティの終了時に表示されます。
次の例は、ユーザー jones が彼女のバックアップファイルを 7:30 pm に削除するように作成した at ジョブを示しています。彼女は、ジョブが終了した後にメールメッセージを受け取れるように、-m オプションを使用しています。
$ at -m 1930 at> rm /home/jones/*.backup at> Press Control-d job 852777000.a at Wed Jan 8 19:30:00 1997
jones は次のメールメッセージを受け取りました。このメッセージは at ジョブが終了したことを確認しています。
Your "at" job "rm /home/jones/*.backup" completed.
次の例は、jones が大きな at ジョブをどのように土曜日の朝 4:00 にスケジュールしているかを示します。その出力は、big.file に送られます。
$ at 4 am Saturday at> sort -r /usr/dict/words > /export/home/jones/big.file
at 待ち行列で実行を待っているジョブを確認するには、次に示すように atq コマンドを使用します。このコマンドは、その使用者が作成した at ジョブに関する状態情報を表示します。
$ atq
at ジョブが作成できたかどうかを確認するには、atq コマンドを使用します。次の atq コマンドは、jones に属する at ジョブが待ち行列に入っていることを確認しています。
$ atq Rank Execution Date Owner Job Queue Job Name 1st Jan 8, 1997 13:25 jones 852755100.a a stdin 2nd Jan 8, 1997 19:30 jones 852777000.a a stdin 3rd Jan 11, 1997 04:00 jones 858142000.a a stdin
自分の at ジョブの実行時刻に関する情報を表示するには、次のように at -l コマンドを使用します。
$ at -l [job-id]
-l job-id |
状態を確認したいジョブの識別番号 |
次の例は、at -l コマンドからの出力を示しています。このコマンドは、特定のユーザーが依頼したすべてのジョブに関する状態情報を得ることを目的としています。
$ at -l 852755100.a Wed Jan 8 13:25:00 1997 852777000.a Wed Jan 8 19:30:00 1997 858142000.a Sat Jan 11 04:00:00 1997
次の例は、at -l コマンドに 1 つのジョブを指定して表示された出力を示しています。
$ at -l 858142000.a 858142000.a Sat Jan 11 04:00:00 1996
次のように入力して、at ジョブを実行される前に待ち行列から削除します。
$ at -r [job-id]
-r job-id |
削除したいジョブの識別番号 |
at ジョブを削除できたかどうかを確認するには、at -l (または atq) コマンドを使用して at 待ち行列に残っているジョブを表示します。識別番号を指定したジョブは、このリストに現れてはなりません。
$ at -l [job-id]
次の例では、ユーザーが 3 月 1 日の正午に実行されるようにスケジュールした at ジョブを削除しようとしています。まず、このユーザーは at 待ち行列を表示してそのジョブの識別番号を探します。次に、そのジョブを at 待ち行列から削除します。最後に、at 待ち行列をもう一度表示して上記のジョブが削除されていることを確認します。
$ at -l 852755100.a Wed Jan 8 13:25:00 1997 852777000.a Wed Jan 8 19:30:00 1997 858142000.a Sat Jan 11 04:00:00 1997 $ at -r 858142000.a $ at -l 858142000.a at: 858142000.a does not exist
at.deny ファイルに含まれているユーザーは、at を使用してジョブをスケジュールすることも、at 待ち行列の状態を調べることもできません。
at.deny ファイルは、Solaris ソフトウェアのインストール時にディレクトリ /etc/cron.d に格納されます。そのときに、同じユーザーがこのファイルとデフォルトの cron.deny ファイルの両方に含まれます。
daemon bin smtp nuucp listen nobody noaccess
このファイルを編集するにはスーパーユーザー特権が必要です。
スーパーユーザーになります。
エディタを使用して、/etc/cron.d/at.deny ファイルをオープンします。
たとえば次のように、at コマンドを使用させないようにするユーザー名を 1 行に 1 つずつ追加または削除します。
daemon bin smtp nuucp listen nobody noaccess username1 username2 username3 . . .
/etc/cron.d/at.deny ファイルをクローズして、変更結果を保存します。
次は、ユーザー smith と jones が at にアクセスできないように編集された at.deny ファイルの例です。
$ cat at.deny daemon bin smtp nuucp listen nobody noaccess jones smith
特定のユーザー名が正しく /etc/cron.d/at.deny に追加されているかどうかを確認するには、そのユーザー名でログインして、at -l コマンドを使用します。そのユーザーが at コマンドにアクセスできない場合は、次のメッセージが表示されます。
# su smith Password: $ at -l at: 使用許可されていません
同様に、そのユーザーが at ジョブの実行を依頼しようとした場合は、次のメッセージが表示されます。
$ at 2:30pm at: 使用許可されていません
これで、そのユーザーが at.deny ファイルに含まれていることが確認されます。