Solaris のシステム管理 (第 2 巻)

1 つのシステムイベントのスケジューリング (at)

以降の項では、at(1) コマンドを使用してコマンドやスクリプトなどのジョブを後で特定の時刻に実行するようにスケジュールする方法、それらのジョブを削除または表示する方法、および at コマンドへのアクセスを制御する方法について説明します。

デフォルトでは、ユーザーはそれぞれ自分の at ジョブファイルを作成、表示、または削除できます。root または他のユーザーの at ファイルにアクセスするには、スーパーユーザーの権限が必要です。

at ジョブの実行を依頼すると、at ジョブにジョブ識別番号と .a 拡張子が与えられ、それがファイル名になります。

at コマンドの説明

at ジョブファイルを実行するには、次の手順に従います。

  1. コマンド実行時刻を指定して at ユーティリティを起動します。

  2. 後で実行させるコマンドまたはスクリプトを入力します。


    注 -

    このコマンドまたはスクリプトからの出力が重要な場合は、後で調べられるように必ずファイルに書き込むようにしてください。


たとえば、次の at ジョブは、7 月 31 日の真夜中に smith のユーザーアカウントから core ファイルを削除します。


$ at 11:45pm July 31
at> rm /home/smith/*core*
at> Press Control-d
commands will be executed using /bin/csh
job 933486300.a at Sat Jul 31 23:45:00 1999

at コマンドのセキュリティ

特定のユーザーだけがそれぞれの at ジョブに関する待ち行列情報を作成、削除、または表示できるように、at コマンドへのアクセスを制御するファイルを設定できます。at へのアクセスを制御するファイルは /etc/cron.d/at.deny です。ここにはユーザー名が列挙 (1 行に 1 人) されています。このファイルに列挙されているユーザーは、at コマンドにアクセスできません。

Solaris ソフトウェアのインストール時に作成される at.deny ファイルには、次のユーザー名が含まれます。

daemon
bin
smtp
nuucp
listen
nobody
noaccess

スーパーユーザーの特権があれば、このファイルを編集して、at へのアクセスを制限したい他のユーザー名を追加できます。

at ジョブを作成する方法

  1. 次のように、自分のジョブを実行したい時刻を指定して at コマンドを入力し、Return キーを押します。


    $ at [-m] time [date] 

    -m

    ジョブ終了後にメールを送る 

    time

    ジョブをスケジュールしたい時刻の時単位の値。24 時間制を使用しない場合は、am または pm を追加する。midnightnoonnow はキーワードとして使用可能。分単位の値の指定は省略可能

    date

    月または曜日の名前の最初の 3 英字以上、またはキーワード today または tomorrow

  2. at プロンプトに、実行したいコマンドまたはスクリプトを 1 行に 1 つずつ入力します。各行の終わりで Return キーを押すことにより、複数のコマンドを入力できます。

  3. at ユーティリティを終了し、Control-d キーを押して at ジョブを保存します。

    作成できた at ジョブは待ち行列番号を割り当てられ、それがそのファイル名にもなります。この番号は at ユーティリティの終了時に表示されます。

例 - at ジョブを作成する

次の例は、ユーザー jones が彼女のバックアップファイルを 7:30 pm に削除するように作成した at ジョブを示しています。彼女は、ジョブの終了後にメールメッセージを受け取れるように、-m オプションを使用しています。


$ at -m 1930
at> rm /home/jones/*.backup
at> Press Control-d
job 897355800.a at Mon Jul  12 19:30:00 1999

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 待ち行列を表示する方法

at 待ち行列で実行を待っているジョブを確認するには、次に示すように atq コマンドを使用します。このコマンドは、その使用者が作成した at ジョブに関する状態情報を表示します。


$ atq

at ジョブを確認する方法

at ジョブが作成できたかどうかを確認するには、atq コマンドを使用します。次の atq コマンドは、jones に属する at ジョブが待ち行列に入っていることを確認しています。


$ atq
  Rank  Execution Date       Owner  Job         Queue   Job Name
  1st   Jul 12, 1999 19:30   jones  897355800.a     a     stdin
  2nd   Jul 14, 1999 23:45   jones  897543900.a     a     stdin
  3rd   Jul 17, 1999 04:00   jones  897732000.a     a     stdin

at ジョブを表示する方法

自分の at ジョブの実行時刻に関する情報を表示するには、次のように at -l コマンドを使用します。


$ at -l [job-id]
-l job-id

状態を確認したいジョブの識別番号 

例 - at ジョブを表示する

次の例は、at -l コマンドからの出力を示しています。このコマンドは、特定のユーザーが依頼したすべてのジョブに関する状態情報を得ることを目的としています。


$ at -l 
897543900.a	Wed Jul 14 23:45:00 1999
897355800.a	Mon Jul 12 19:30:00 1999
897732000.a	Sat Jul 17 04:00:00 1999

次の例は、at -l コマンドに 1 つのジョブを指定して表示された出力を示しています。


$ at -l 897732000.a
897732000.a		Sat Jul 17 04:00:00 1999 

at ジョブを削除する方法

  1. (省略可能) root または他のユーザーの at ジョブを削除する場合は、スーパーユーザーになります。

  2. 次のように入力して、at ジョブを実行される前に待ち行列から削除します。


    $ at -r [job-id]

    -r job-id

    削除したいジョブの識別番号 

  3. at ジョブを削除できたかどうかを確認するには、at -l (または atq) コマンドを使用して at 待ち行列に残っているジョブを表示します。識別番号を指定したジョブは、このリストに現れてはなりません。


    $ at -l [job-id]

例 - at ジョブを削除する

次の例では、ユーザーが 7 月 17 日の午前 4 時に実行されるようにスケジュールした at ジョブを削除しようとしています。まず、このユーザーは at 待ち行列を表示してそのジョブの識別番号を探します。次に、そのジョブを at 待ち行列から削除します。最後に、at 待ち行列をもう一度表示して上記のジョブが削除されていることを確認します。


$ at -l
897543900.a	Wed Jul 14 23:45:00 1999
897355800.a	Mon Jul 12 19:30:00 1999
897732000.a	Sat Jul 17 04:00:00 1999
$ at -r 897732000.a
$ at -l 897732000.a
at: 858142000.a: No such file or directory