はじめに
みなさま、atコマンドを活用されていますでしょうか?
時間指定で任意のコマンドを実行させたい場合、Cronで設定することがほとんどかと思います。
Cron設定では、定期的に実行するものを登録しますが、そこまでではない、一度だけ時間指定で
実行したいといった際、atコマンドが実現してくれます。
そんな、atコマンドについて紹介させていただきます。
環境
OS : AlmaLinux 9
atバージョン : 3.1
使い方
今回は例として、指定した時間にwコマンドを実行してロードアベレージを確認したいと思います。
wコマンドの前に、dateコマンドを実行して、実行した時間も分かるようにしたいので、
下記の指定でatコマンドを実行します。
$ echo "(date; w)" | at 1:53
warning: commands will be executed using /bin/sh
job 28 at Wed Mar 25 01:53:00 2026
$
表示された警告は想定通りなのでスルーします。
ジョブとして正常に登録されているかは下記のコマンドで確認できます。
$ atq
28 Wed Mar 25 01:53:00 2026 a future
$
想定通りジョブが登録されていますね。
ただし、指定時間を経過しましたが、コマンドの実行結果が表示されません。。。
$ atq
$
登録されていたジョブもなくなっていますね。
これは、atの実行環境で出力されたため、ターミナル上に出力させたい場合は、/dev/pts/0に出力をリダイレクトする必要があります。
というわけで改めて
$ echo "(date; w) > /dev/pts/0" | at 1:54
warning: commands will be executed using /bin/sh
job 29 at Wed Mar 25 01:54:00 2026
$
リダイレクト先にターミナルを指定してatコマンドを実行します。
$ atq
29 Wed Mar 25 01:54:00 2026 a future
$
ジョブ登録されていますね。
$ Wed Mar 25 01:54:00 AM JST 2026
01:54:00 up 12 days, 10:36, 1 user, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
future pts/0 23:29 39.00s 0.27s 0.27s -bash
$
指定時間になると、無事に上記出力が表示されました。
続いて、スクリプトファイルを作成しておいて、そちらを指定してジョブ登録することも可能です。先ほど同様のコマンドを実行するシェルスクリプトを作成しておきます。
$ ls -la load-chek.sh
-rwxr-xr-x 1 future future 39 Mar 25 00:55 load-chek.sh
$
$ cat load-chek.sh
#!/bin/bash
(date; w) > w.log
exit 0
$
作成したスクリプトファイルを指定する形で、以下のようにatコマンドを実行します。
$ at -f ./load-chek.sh 1:56
warning: commands will be executed using /bin/sh
job 31 at Wed Mar 25 01:56:00 2026
$
ジョブとして登録されていますね。
$ atq
31 Wed Mar 25 01:56:00 2026 a future
$
-c オプションでジョブIDを指定することで、ジョブの中身を表示することもできます。
$ at -c 31
#!/bin/sh
# atrun uid=1000 gid=1000
# mail future 0
umask 22
SHELL=/bin/bash; export SHELL
HISTCONTROL=ignoredups; export HISTCONTROL
HISTSIZE=1000; export HISTSIZE
HOSTNAME=ume-alm9.local; export HOSTNAME
SSH_AUTH_SOCK=/tmp/ssh-XXXXrkKFR2/agent.862559; export SSH_AUTH_SOCK
PWD=/home/future; export PWD
LOGNAME=future; export LOGNAME
XDG_SESSION_TYPE=tty; export XDG_SESSION_TYPE
MOTD_SHOWN=pam; export MOTD_SHOWN
HOME=/home/future; export HOME
LANG=en_US.UTF-8; export LANG
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=40\;31\;01:mi=01\;37\;41:su=37\;41:sg=30\;43:ca=30\;41:tw=30\;42:ow=34\;42:st=37\;44:ex=01\;32:\*.tar=01\;31:\*.tgz=01\;31:\*.arc=01\;31:\*.arj=01\;31:\*.taz=01\;31:\*.lha=01\;31:\*.lz4=01\;31:\*.lzh=01\;31:\*.lzma=01\;31:\*.tlz=01\;31:\*.txz=01\;31:\*.tzo=01\;31:\*.t7z=01\;31:\*.zip=01\;31:\*.z=01\;31:\*.dz=01\;31:\*.gz=01\;31:\*.lrz=01\;31:\*.lz=01\;31:\*.lzo=01\;31:\*.xz=01\;31:\*.zst=01\;31:\*.tzst=01\;31:\*.bz2=01\;31:\*.bz=01\;31:\*.tbz=01\;31:\*.tbz2=01\;31:\*.tz=01\;31:\*.deb=01\;31:\*.rpm=01\;31:\*.jar=01\;31:\*.war=01\;31:\*.ear=01\;31:\*.sar=01\;31:\*.rar=01\;31:\*.alz=01\;31:\*.ace=01\;31:\*.zoo=01\;31:\*.cpio=01\;31:\*.7z=01\;31:\*.rz=01\;31:\*.cab=01\;31:\*.wim=01\;31:\*.swm=01\;31:\*.dwm=01\;31:\*.esd=01\;31:\*.jpg=01\;35:\*.jpeg=01\;35:\*.mjpg=01\;35:\*.mjpeg=01\;35:\*.gif=01\;35:\*.bmp=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.tif=01\;35:\*.tiff=01\;35:\*.png=01\;35:\*.svg=01\;35:\*.svgz=01\;35:\*.mng=01\;35:\*.pcx=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.mpeg=01\;35:\*.m2v=01\;35:\*.mkv=01\;35:\*.webm=01\;35:\*.webp=01\;35:\*.ogm=01\;35:\*.mp4=01\;35:\*.m4v=01\;35:\*.mp4v=01\;35:\*.vob=01\;35:\*.qt=01\;35:\*.nuv=01\;35:\*.wmv=01\;35:\*.asf=01\;35:\*.rm=01\;35:\*.rmvb=01\;35:\*.flc=01\;35:\*.avi=01\;35:\*.fli=01\;35:\*.flv=01\;35:\*.gl=01\;35:\*.dl=01\;35:\*.xcf=01\;35:\*.xwd=01\;35:\*.yuv=01\;35:\*.cgm=01\;35:\*.emf=01\;35:\*.ogv=01\;35:\*.ogx=01\;35:\*.aac=01\;36:\*.au=01\;36:\*.flac=01\;36:\*.m4a=01\;36:\*.mid=01\;36:\*.midi=01\;36:\*.mka=01\;36:\*.mp3=01\;36:\*.mpc=01\;36:\*.ogg=01\;36:\*.ra=01\;36:\*.wav=01\;36:\*.oga=01\;36:\*.opus=01\;36:\*.spx=01\;36:\*.xspf=01\;36:; export LS_COLORS
SSH_CONNECTION=192.168.200.115\ 34598\ 192.168.210.179\ 22; export SSH_CONNECTION
XDG_SESSION_CLASS=user; export XDG_SESSION_CLASS
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
USER=future; export USER
SHLVL=1; export SHLVL
XDG_SESSION_ID=689; export XDG_SESSION_ID
XDG_RUNTIME_DIR=/run/user/1000; export XDG_RUNTIME_DIR
PS1=[\\u@\\H\ \\W]\\\$\ ; export PS1
SSH_CLIENT=192.168.200.115\ 34598\ 22; export SSH_CLIENT
DEBUGINFOD_IMA_CERT_PATH=/etc/keys/ima:; export DEBUGINFOD_IMA_CERT_PATH
which_declare=declare\ -f; export which_declare
XDG_DATA_DIRS=/home/future/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS
PATH=/home/future/.local/bin:/home/future/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/future/.composer/vendor/bin; export PATH
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; export DBUS_SESSION_BUS_ADDRESS
MAIL=/var/spool/mail/future; export MAIL
SSH_TTY=/dev/pts/0; export SSH_TTY
cd /home/future || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER133a959d'
#!/bin/bash
(date; w) > w.log
exit 0
marcinDELIMITER133a959d
$
の内
環境変数含めて、シェルの内容が確認できますね。
$ atq
$
ジョブが実行されたようです。実行結果を出力しているログを見てみましょう。
$ ls -la w.log
-rw-r--r-- 1 future future 209 Mar 25 01:56 w.log
$
$ cat w.log
Wed Mar 25 01:56:00 AM JST 2026
01:56:00 up 12 days, 10:38, 1 user, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
future pts/0 23:29 39.00s 0.29s 0.29s -bash
$
実行結果が出力されています。想定通りです。
最後に、先ほどと同様の時間指定でatコマンドを実行すると、既に経過した時間なので、実行されないのですが、ジョブの登録自体はできてしまいます。
$ at -f ./load-chek.sh 1:56
warning: commands will be executed using /bin/sh
job 32 at Thu Mar 26 01:56:00 2026
$
$ atq
32 Thu Mar 26 01:56:00 2026 a future
$
該当ジョブについて、下記コマンドにて削除することができます。
$ atrm 32
$
$ atq
$
指定したジョブが削除されました。
まとめ
いかがでしたか?
正直そこまで使用頻度は高くないですが、知っていて損は無いかと思います。
atコマンドによる、時間指定でのコマンド実行が必要になった際には、是非とも活用ください。

