atコマンドとは
atコマンドは、指定した日時に1回限りコマンドを実行するジョブを予約できるコマンドである。
cronは定期的に繰り返し実行するジョブの予約に向いているが、「1時間後に1回だけ実行したい」のような1回限りのジョブにはatが向いている。
atによるジョブの実行はatdデーモンが担う。Debian/Ubuntu系では以下でインストールする。
$ sudo apt install at
$ sudo systemctl start atd
$ sudo systemctl enable atd
ジョブを登録する
atに日時を指定して実行すると、標準入力でコマンドを受け付ける状態になる。実行したいコマンドを入力し、最後にCtrl+Dを押すとジョブが登録される。
$ at now + 1 minute
at> echo hello > /tmp/at-output.txt
at> <EOT>
job 1 at Sun Jul 12 21:59:00 2026
パイプでコマンドを渡して登録もできる。
$ echo 'echo hello > /tmp/at-output.txt' | at now + 1 minute
job 1 at Sun Jul 12 21:59:00 2026
1分後に/tmp/at-output.txtを確認すると、ジョブの実行結果を確認できる。
$ cat /tmp/at-output.txt
hello
atジョブの標準出力は、本来ジョブを実行したユーザー宛にメールで送信される仕様である。上記の例のように出力をファイルへリダイレクトしておくと、メール環境の有無に関わらず実行結果を確認できる。
日時の指定方法
atの日時指定はnow + 1 minuteのような相対指定と、具体的な時刻の指定の両方に対応している。
$ echo 'echo foo' | at now + 1 minute
$ echo 'echo foo' | at now + 2 hours
$ echo 'echo foo' | at 15:30
$ echo 'echo foo' | at tomorrow
$ echo 'echo foo' | at 9:00 tomorrow
予約したジョブを確認する
atqで予約中のジョブ一覧を確認できる。
$ atq
2 Sun Jul 12 23:58:00 2026 a root
3 Mon Jul 13 21:57:00 2026 a root
ジョブの中身を確認するにはat -cにジョブ番号を指定する。
$ at -c 2
...
echo foo
予約したジョブを削除する
atrmにジョブ番号を指定すると、そのジョブを削除できる。
$ atrm 2
$ atq
3 Mon Jul 13 21:57:00 2026 a root
スクリプトファイルからジョブを登録する
-fオプションでスクリプトファイルを指定すると、標準入力からの対話的な入力をせずにジョブを登録できる。
$ cat job.sh
#!/bin/bash
echo "job executed at $(date)" >> /tmp/at-output.txt
$ at -f job.sh now + 1 minute
job 5 at Sun Jul 12 21:59:00 2026
デプロイ後のメンテナンスモード解除や、一時的なリソースの削除など、決まった時刻に1回だけ実行したい作業をスクリプト化して登録する場合に活用できる。
参考
\第一線のプログラマーの行動原理を学べる!/
