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で予約した一覧(キュー)を見ることで今後実行される一覧が確認できる。
- 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