一、at命令介绍
at命令是一个计划任务工具,可以让用户在指定的时间执行某个命令或者脚本,at命令用于管理一次性计划任务。
二、at命令的使用帮助
2.1 at命令的help帮助信息
代码语言:shell复制在命令行中使用help查询at命令的使用帮助信息
[root@jeven ~]# at --help
at: invalid option -- '-'
Usage: at [-V] [-q x] [-f file] [-mMlbv] timespec ...
at [-V] [-q x] [-f file] [-mMlbv] -t time
at -c job ...
atq [-V] [-q x]
at [ -rd ] job ...
atrm [-V] job ...
batch
2.2 at命令的语法解释
- 语法
at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]
- 选项
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-l:显示待执行任务的列表;
-d:删除指定的待执行任务;
-m:任务执行完成后向用户发送E-mail。
- 参数
日期时间:指定任务执行的日期时间。
三、at命令的日常使用
3.1 立即执行一次性任务
代码语言:shell复制立即执行一次性任务,使用 at now 命令,输入该命令后,会在终端下面出现一个at>提示符,此时输入要执行的命令,然后按下Ctrl D即可。
[root@jeven ~]# at now
at> echo "hello" >> /tmp/aa.txt
at> <EOT>
job 1 at Thu Nov 16 16:16:00 2023
代码语言:shell复制这个命令会在当前时间执行一次性任务,将字符串"hello "追加到/tmp/aa.txt文件中。
[root@jeven ~]# cat /tmp/aa.txt
hello
3.2 指定时间执行一次性任务
代码语言:shell复制输入该命令后,会在终端下面出现一个at>提示符,此时输入要执行的命令,然后按下Ctrl D即可
[root@jeven ~]# at 16:22
at> echo "test" >> /tmp/test.txt
at> <EOT>
job 2 at Thu Nov 16 16:22:00 2023
代码语言:shell复制在16:22时间后,查询字符串"test"已成功追加到/tmp/test.txt文件中。
[root@jeven ~]# cat /tmp/test.txt
test
3.3 查询计划任务
代码语言:shell复制计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务。
[root@jeven ~]# atq
2 Thu Nov 16 16:22:00 2023 a root
3.4 其他指定时间用法
- 指定2天后的下午5点执行命令df -hT命令
[root@jeven ~]# at 5:00pm 2 days
at> /bin/df -hT
at> <EOT>
job 3 at Sat Nov 18 17:00:00 2023
- 明天上午8点,将时间输出到指定文件。
[root@jeven ~]# at 08:00am tomorrow
at> date >> /tmp/date.txt
at> <EOT>
job 4 at Fri Nov 17 08:00:00 2023
3.5 删除已经设置的计划任务
代码语言:shell复制查询还未执行的计划任务
[root@jeven ~]# at -l
3 Sat Nov 18 17:00:00 2023 a root
4 Fri Nov 17 08:00:00 2023 a root
代码语言:shell复制删除已经设置的计划任务
atrm 3
3.6 显示某计划任务详细内容
代码语言:shell复制显示某计划任务详细内容
at -c 4
代码语言:shell复制#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=8; export XDG_SESSION_ID
HOSTNAME=jeven; export HOSTNAME
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
SSH_CLIENT=192.168.3.168 56614 22; export SSH_CLIENT
SSH_TTY=/dev/pts/0; export SSH_TTY
http_proxy=http://127.0.0.1:38457; export http_proxy
USER=root; export USER
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;05;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:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=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:*.jpg=01;35:*.jpeg=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:*.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:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=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:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:; export LS_COLORS
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/node-v14.17.0-linux-x64/bin/:/usr/local/bin:/root/bin; export PATH
PWD=/root; export PWD
LANG=en_US.UTF-8; export LANG
https_proxy=https://127.0.0.1:38457; export https_proxy
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share; export XDG_DATA_DIRS
SSH_CONNECTION=192.168.3.168 56614 192.168.3.166 22; export SSH_CONNECTION
LESSOPEN=||/usr/bin/lesspipe.sh %s; export LESSOPEN
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
NODE_HOME=/root/node-v14.17.0-linux-x64/bin/; export NODE_HOME
cd /root || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER200a5ac0'
date >> /tmp/date.txt
marcinDELIMITER200a5ac0
四、at与crontab命令的区别
at和crontab都是用于任务调度的命令,但是它们的使用场景和运行方式不同,at命令适用于一次性的任务调度,而crontab命令适用于周期性的任务调度。。
- at命令是一次性的任务调度,它允许用户将任务安排到指定的时间点运行一次,该任务将在指定的时间点被执行一次后立即被销毁。at命令适用于只需要执行一次的任务,例如立即发送一封电子邮件或在明天早上备份系统。
- crontab命令则可以定期重复执行指定的任务,它可以在固定的时间间隔内不间断地运行任务。crontab命令常用于周期性的任务,例如每天备份数据库或定时清理日志文件。
五、at命令的使用注意事项
- at命令不适用于需要用户交互的程序,它只适用于一些可以直接运行的命令或程序。
- at命令需要root用户或具备特殊权限的用户才能进行操作。
- at命令虽然可以在指定的时间运行命令或程序,但不保证一定会在该时间运行,因为系统可能会出现一些延迟。
- at命令可以运行多个命令或程序,只需要将它们以分号隔开即可。
- at命令在执行命令或程序时,会自动在后台进行,不会在当前终端显示结果,如果需要查看结果,需要手动查看日志文件或者输出到文件中。
- at命令的执行时间必须按照24小时制的时间格式指定。
- at命令可以使用atq命令查看等待运行的任务列表,使用atrm命令删除未执行的任务。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!