atコマンドの使い方

atコマンドについて

「at」コマンドを使用すると、指定した日時にコマンド(ジョブ)を実行させることができます。「cron」と異なる点は、「cron」は設定した日時になると繰り返し登録された処理が実行されますが、「at」コマンドの場合は一度だけしか処理が実行されません

ですので、状況に合わせて「cron」と「at」を使い分けると良いでしょう。

「at」コマンドがインストールされていない場合は、「yum」でインストールしてください。

# yum install at

インストール後はサービスの開始と自動起動設定を忘れずに行ってください。

CentOS7であれば「systemctl」コマンドを使用して設定します。

# systemctl start atd
# systemctl enable atd

CentOS6以前であれば下記のように設定を行ってください。

# /etc/init.d/atd start
# chkconfig on atd

ちなみに、「atd」を起動させずに「at」コマンドを実行した場合は「Can't open /var/run/atd.pid to signal atd. No atd running? 」といったメッセージが表示されてエラーとなります。

$ at 10:12
at> logger test
at> 
job 1 at Thu Jun  1 10:12:00 2017
Can't open /var/run/atd.pid to signal atd. No atd running?

ジョブの登録

「at」コマンドで、日時を指定して実行したいコマンド(ジョブ)を登録するには下記のようにいくつかの方法がありますので、それぞれの方法について説明をしていきます。

  • at [オプション] "日時"  (対話型)
  • echo "コマンド" | at "日時"
  • at "日時" -f "ファイル"
  • at "日時" < "ファイル"

 

オプション一覧
オプション 説明
-f ファイル名 指定したファイルを読み込む
-m コマンド実行後メールを送信
-M コマンド実行後メールを送信しない
-t [[CC]YY]MMDDhhmm[.ss] [[CC]YY]MMDDhhmm[.ss]で時刻を指定
-l atqと同様(登録ジョブを確認)
-r ジョブ番号 atrmと同様(ジョブを削除)
-d ジョブ番号 atrmと同様(ジョブを削除)
-q 指定したキューを使用
-V バージョンを表示

日時の指定方法

「at」コマンドで日時を指定する場合は、下記の形式で指定することができます。

  • 時間:分
  • 時間:分 日.月.年
  • 時間:分 月日年
  • 時間:分 月/日/年
  • 時間:分 年-月-日

timespec形式による設定方法

あまり使わないかも知れませんが、timespecで設定されている形式でも指定できます。

  • now (現在)
  • am / pm (午前 / 午後)
  • today 本日
  • tomorrow 明日
  • midnight 午前 0:00
  • noon 午後 0:00
  • teatime 午後 4:00
月の指定

月の指定は下記の表記でも設定可能です。

  • Jan (1月)
  • Feb (2月)
  • Mar (3月)
  • Apr (4月)
  • May (5月)
  • Jun (6月)
  • Jul (7月)
  • Aug (8月)
  • Sep (9月)
  • Oct (10月)
  • Nov (11月)
  • Dec (12月)
曜日の指定

曜日は下記の表記でも設定可能です。

  • Sun  (日曜日)
  • Mon  (月曜日)
  • Tue  (火曜日)
  • Wed  (水曜日)
  • Thu  (木曜日)
  • Fri  (金曜日)
  • Sat  (土曜日)
経過時間による設定

指定した時間からの経過時間後に実行させるという指定も可能です。

now + 数字 経過時間   (nowは現在)
時間 + 数字 経過時間

経過時間は下記の表記で指定可能です。

  • minutes (分)
  • hours (時間)
  • days (日)
  • weeks (週間)

例えば12時間後の場合は「now + 12 hours」といったように指定することが出来ます。
2週間後のAM4:00の場合は「4:00 + 2 weeks」という形で指定することになります。

その他の設定例として、man at (1) に記述されている設定例をあげておきます。

  • at 4pm + 3 days (3日後の午後4時)
  • at 10am Jul 31 (7月31日の午前10時)
  • at 1am tomorrow (明日の午前1時)

at "日時" (対話形式)

「at "日時"」の形式で「at」コマンドを実行すると、対話形式で実行するコマンドを入力するmモードになります。

実行するコマンドを入力後、「Ctrl」+「d」キーを押下することで登録を完了することができます。

at "日時"
at > 実行コマンド
at > [Ctrl]+[d]

下記の場合は2017年6月1日の17:30分に「logger」コマンドを実行させています。

$ at "17:30 01.06.2017" 
at> logger test
at> ([Ctrl]+[d]を入力)
job 7 at Thu Jun  1 17:30:00 2017

echo "実行コマンド" | at "日時"

「echo」で標準出力に実行するコマンドを表示させ、パイプ(|)で「at」コマンドに渡すことでもジョブを登録することが出来ます。

echo "実行コマンド" | at "日時"

「logger」コマンドをパイプ(|)で「at」コマンドに渡して、16:20分に実行させるようにジョブを登録しています。

$ echo "logger test" | at "16:20"
job 18 at Fri Jun  2 16:20:00 2017

at "日時" -f (ファイルを読み込んで実行)

「-f」オプションを使用することで、実行させたいコマンドが記述されたファイルを読み込む形で登録することが出来きます。

at "日時" -f ファイル名

下記のようなシェルスクリプトを作成して、それを読み込みませてジョブを登録させてみます。

スクリプト内容

内容的には「logger」コマンドでログを出力するだけです。

$ cat at_test.sh
#!/bin/bash
logger "at-test `date`"
ジョブの登録

2017年6月1日17時35分にスクリプトを読み込んでジョブを登録させています。

$ at "17:35 01.06.2017" -f /home/tamohiko/at_test.sh
job 8 at Thu Jun  1 17:35:00 2017

at "日時" < "ファイル"

「-f」オプションの代わりに「<」を使用してファイルを「at」コマンドに読み込ませることもできます。

at "日時" < ファイル

2017年6月1日17時35分にスクリプトを読み込んでジョブを登録させています。

$ at "17:35 02.06.2017" < /home/tamohiko/at_test.sh
job 22 at Fri Jun  2 17:35:00 2017

ジョブの確認

「at」コマンドで登録された実行待ちのジョブは、「atq」「at -l」コマンドのどちらかを実行することで確認できます。

atq
at -l

いくつかジョブを事前に登録して確認してみました。

$ atq
7       Thu Jun  1 17:30:00 2017 a tamohiko
8       Thu Jun  1 17:35:00 2017 a tamohiko

表示される内容は、左から「ジョブ番号」「実行日時」「キューの名前」「実行ユーザ」となります。(今回の場合キューの名前は「a」となります)

ジョブ内容の確認

登録されたジョブの内容を確認するには「-c」オプションを使用します。

at -c ジョブ番号

ジョブの取り消し

登録されたジョブを取り消すには「atrm」「at -d」「at -r」のどれかを使用します。

atrm ジョブ番号
at -d ジョブ番号
at -r ジョブ番号

まず、現在登録されているジョブを確認してみると、3つのジョブが登録されていることが確認できました。

$ atq
10      Thu Jun  1 22:15:00 2017 a tamohiko
11      Thu Jun  1 22:20:00 2017 a tamohiko
12      Thu Jun  1 22:30:00 2017 a tamohiko

今回はジョブ番号「10」のジョブを削除してみます。

$ atrm 10

ジョブの一覧を確認してい見ると、10番のジョブが削除されたことが確認できました。

$ atq
11      Thu Jun  1 22:20:00 2017 a tamohiko
12      Thu Jun  1 22:30:00 2017 a tamohiko

コメント

タイトルとURLをコピーしました