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回だけ実行したい作業をスクリプト化して登録する場合に活用できる。

参考

» at(1) - Debian Manpages