それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

atコマンドの使い方(指定時間にコマンドを実行する)でスケジュール実行。

at コマンドとは

ある時刻に、プログラムを動かす、タイマー(アラート・目覚まし)機能


atコマンドを使うと、コマンドを未来の指定時間に実行できる。dosのatコマンドもある。今回はUNIXのatコマンドの使い方。。

インストール

sudo apt install at

スケジュールを指定してタスクの実行

コマンドを実行する未来の一点を指定する。

 at "19:14 30.04.12"  -f date.sh

これで2012年4月30日の19時14分にdate.shファイルの内容が/bin/shで実行される。

 at 時刻   -f 実行ファイル名

登録した ジョブの内容を知るには

at -c [ジョブ番号]

登録したジョブを消すには

atrm [ジョブ番号]

cronとの違い

cronだと何月何日何時何分を指定する。使用後は消さないとダメ。消し忘れると1年後また動く。
atだと、使い捨て、一回実行されたらおしまい。

実行さえ出来ればいいときはatコマンドを選ぶほうが楽。
古くからのコマンドなので、時刻形式も選択肢が少ない、ブログ記事も減っていて、調べるのがちょっと面倒だった。

使用後に消さなくていいのが一番大きな違いかな。

at の特長

コマンド 実行方式 実行後 ログ 登録方法 起動されるもの
cron 一定間隔 次の時間までまつ エラーならメールに crontab #!/usr/bin/env ruby で指定
at 指定時間 実行して終わり 特に何も atq にキュー #!/bin/shのみ

cronとの比較で分かった、cronは設定、atは設定でなくキュー。

atは時刻ベースのキュー

atコマンドで予約すると、時刻順のキューに並ぶことになる。
atコマンドは分単位のキュー。

atで実行できるもの

atコマンドで使えるのは、/bin/shのシェルコマンドのみ。
shebangを用いたファイルだと実行されないので、/bin/sh経由で実行できるように考える。

atのキューの一覧を見る。

atで予約した一覧(キュー)を見ることで今後実行される一覧が確認できる。

atq
atコマンドで登録された一覧(キュー)を見る。

例:

takuya@atom:~$ sudo atq | sort  | head
7710    Mon Apr 30 19:22:00 2012 a www-data
7712    Mon Apr 30 21:22:00 2012 a www-data
7714    Mon Apr 30 20:57:00 2012 a www-data
7715    Tue May  1 01:20:00 2012 a www-data
7721    Tue May  1 21:22:00 2012 a www-data

読み方 予約番号、日付、キューの名前、予約者(実行ユーザー)の順にカラムになっている。
予約できたか確認するときはatqを使う。

指定コマンドを指定時間に実行する。

ここからが本題、atコマンドで予約する方法。

at “時刻” -f “コマンドファイルパス”

これは、実例を見たほうが早い。

2012年4月30日15時46分に gmail.shを実行する例

takuya@atom:~$ at  "15:46 30.04.12 "  -f "/home/takuya/gmail.sh”
warning: commands will be executed using /bin/sh
job 7808 at Mon Apr 30 15:46:00 2012

実行予約できると予約番号が出てくる

gmail.shの内容

#!/bin/sh
/usr/bin/ruby /home/takuya/gmail.rb

 -f ファイルで指定した「内容」か、標準入力で渡した「内容」がatで実行される。が、これでは実行ができない。

shebanで実行可能ファイルにしてもダメだった。

-f ファイル の指定ファイルに実行可能ファイルを指定してもダメだった。rubyスクリプトファイルをatコマンドしようとしたけどダメだった。

shebang実行形式#!/usr/bin/env ruby を使ったファイルを指定しても、
「内容」を/bin/shに渡すので、コマンドエラーで落ちる。

shebangでなく、実際にファイルを起動する。

たとえば、rubyのファイルを実行したい時には次のようにする。

takuya@atom:~$ echo "/usr/bin/ruby /home/takuya/gmail.rb" | at "19:14 30.04.12"
warning: commands will be executed using /bin/sh
job 7837 at Mon Apr 30 19:14:00 2012

shebangの代わりにちゃんとコマンドを起動して標準入力から渡してやる。標準入力でコマンドを渡すと予約される。

まとめ

at “時刻” -f “コマンドファイル”

または

echo "コマンド文字列 " | at “時刻” 

または

at “時刻” < "コマンド文字列"

まずはこれを覚える。

時刻の指定方法

時刻形式がちょっとややこしい。

atコマンドで使える時刻形式。

形式  2012年4月30日 15時47分
HH:mm DD.MM.YY 15:47 30.04.12
HH:mm MMDDYY 15:47 043012
HH:mm MM/DD/YY 15:47 04/30/12

atコマンド自体が古いものだからかな?時刻フォーマットのサポートが少ないね。
timespecの形式なので

  • +1day
  • + 1week
  • next Thu

なども使える

2016-04-05 追記 at / batch コマンドのジョブキュー管理。

at には batch というコマンドが提供さている。
  • batch はシステムの動作が低い時に実行される処理待ち単純キュー。
  • at は時刻指定で起動する。

いくつもジョブを放り込んで実行待ちするには batch で放り込んでいけばOK

batch と at はキューの名前を指定して管理することが出来る。

なんでもかんでもジョブに放り込んでいくと、管理ができなくなるので、フォルダ毎に分けるように、キューに名前をつけられる。

ただし、キューの名前には命名規則がある。

  • ルール1:a,b,c,d,...A,B,C,,,Z までの名前が使える。
  • ルール2: 小文字は at用にキュー 大文字は batch用のキュー
  • ルール3:例外 a は at 専用 で、b は batch 専用 。覚えやすいように a/b で予約している。

これは、以下の様な感じになっている。

at -q 
├──  at のキュー
└──  batch のキュー

at
├──  a # at のデフォルト
└──  b # batch のデフォルト

at
├──  a,c,d,e,f....z  # 小文字は atキュー 、ただし小文字b はbatchキュー
└──  b, A,B,C,D ....Z ## 大文字は batch キュー 

まとめ

atコマンドで躓くのは、時刻形式とコマンドの形式になりそうだ。

  • 時刻形式の指定が HH:mm DD.MM.YY 
  • /bin/shが解釈可能なコマンド文字列を渡す

ということさえ覚えてしまえば、結構便利に使えるんじゃないかと思います。

2017-10-09 追記

最近はat がインストール必要だったので、インストール方法を追記

2018-05-11

atarm について追記

atコマンドに関する詳しいまとめ

http://cyberam.dip.jp/linux_foundation/taskschedule/at_main.html