crontabのように決まった時刻や日時に定時実行するほどではない処理、例えばラーメンタイマーなどのような一時的なタイマーとして atコマンドを利用する方法がある。
しかし結論からいうとラーメンタイマーでは使えない。(かためなラーメンで良ければ大丈夫かもしれない!)
atコマンドのインストール
わたしの使ったRaspberry Piには atコマンドが無かったので、以下で追加した。
sudo apt-get install at
または
sudo apt install at
結論としてのatコマンド注意点
秒単位の指定ができない
atコマンドのマニュアルには、秒単位の指定方法も記述されているが、実際には秒単位の指定ができない。
例えば現在から3分後に実行という意味のatコマンド
at now + 3 minutes
を設定したとする。
例えば、現在時刻が10時30分20秒だったとすると、atコマンド側では10時33分00秒に実行されてしまう。
要するに設定時の秒が無視されて実行される。
極端な話、10時30分59秒に上記のatコマンドを設定してしまうと、2分ほどで実行されてしまうのだ。
秒単位まで考えない場面でatコマンドは利用した方が良い。
ちなみにわたしはラズベリーパイとUbuntuサーバの双方でatコマンドを試したが、どちらも秒設定は無視された。
atコマンドにaliasは指定できない
ラズパイにAquesTalkで喋らせるためにtalkという自作のaliasを登録してあったのだが、atコマンドでは実行できなかった。
原則として、atコマンドにaliasで設定したショートカット的なコマンドは指定できない。
じゃあどうすれば良いのかと考えたのだが、aliasのようなシェルスクリプトのファイルを作っておき、atコマンドにそのファイルを指定する方法で解決できる。
例えば作ったシェルファイル名がhogeなら、
at now + 5 minutes -f hoge
とすれば指定時間後にhogeファイルのシェルが実行される。
-fのあとにファイル名を指定すればよい。
atコマンドの使い方
例えばおよそ3分後に「ラーメンできたよ!」とターミナルに表示したい場合、
at now + 3 minutes
と打ちこんでEnterキーを押す。
対話形式でどんなコマンドを実行したいか聞いてくるので、実行コマンドを入力する。
例)
echo 'ラーメンできたよ!' > /dev/pts/2
コマンド入力が終わったらCtrl + D を押して終了する。
上記コマンドの最後 > /dev/pts/2 の部分は利用の環境によって変わるため、お使いの環境によって変える必要がある。詳細は後述のatコマンドでechoを使う際の注意点を参照のこと。
実際の入力イメージ
ちなみに予約したコマンドの実行予定時刻はatqコマンドで確認できる。
予約を削除する場合は、atqで表示された予約番号を使って-dオプションで at -d 《予約番号》のように削除できる。
atコマンドでechoを使う際の注意点
echoコマンドは、echo ‘ラーメンできたよ!’のように設定しても表示されない。
自分の利用端末をttyコマンドでチェックして指定する必要がある。
イメージ
ttyで表示された端末名が上記のように /dev/pts/2 であれば、
echo 'ラーメンできたよ!' > /dev/pts/2
のように指定する必要がある。
時間指定に関して
時間指定に関しては、設定時刻がすでに過ぎている場合は明日の同時刻に実行となる。
また、9:30や9:30am、0930などでも指定可能。
例)午前9時半
at 9:30
明日などもtomorrowとして指定できる。
例)明日の午後3時
at 3pm tomorrow
その他、3日後の午前6時に実行したい場合は、
at 6am + 3 days
などなど色々と柔軟に設定できる。
年月日と日時まで指定する方法もある。
例えば、2024年6月3日の11時29分30秒に実行したい場合、-tオプションをつけて
at -t 202406031129.30
と記述できる。最後の.30が秒数の指定だが、前述の注意点同様に秒は無視され2024年6月3日の11時29分ちょうどに実行されることになる。
時刻指定方法その他の詳細は、man atでチェックしてくだされ。
コメント