ラズパイ:atコマンドで一時的なタイマー機能を使う際の注意点

Raspberry Pi

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を使う際の注意点を参照のこと。

実際の入力イメージ

画像ではminutesではなくminuteになっているがエラーにはならなかった。結構atコマンドはアバウトな感じだ

ちなみに予約したコマンドの実行予定時刻はatqコマンドで確認できる。
予約を削除する場合は、atqで表示された予約番号を使って-dオプションで at -d 《予約番号》のように削除できる。

atコマンドでechoを使う際の注意点

echoコマンドは、echo ‘ラーメンできたよ!’のように設定しても表示されない。
自分の利用端末をttyコマンドでチェックして指定する必要がある。

イメージ

ttyで表示された端末名が上記のように /dev/pts/2 であれば、

echo 'ラーメンできたよ!' > /dev/pts/2

のように指定する必要がある。

時間指定に関して

時間指定に関しては、設定時刻がすでに過ぎている場合は明日の同時刻に実行となる。

また、9:309:30am0930などでも指定可能。

例)午前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でチェックしてくだされ。

コメント

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