linux定时计划任务之at
该定时计划任务at专为一次性完成特定任务而设计,在处理非周期性工作时表现出色。它特别适合那些只需在指定时刻运行一次即可完成的任务,并且一旦完成就会被从队列中移除。
1.at安装
命令:
yum install -y at
[root@patrolagent ~]# yum install -y at
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
rhel7 | 4.1 kB 00:00:00
Package at-3.1.13-22.el7.x86_64 already installed and latest version
Nothing to do
[root@patrolagent ~]#
定时计划任务at依赖atd守护进程运行,检查确保at服务已启动。
命令:
systemctl enable atd
systemctl start atd
systemctl status atd
[root@patrolagent ~]# systemctl enable atd
[root@patrolagent ~]# systemctl start atd
[root@patrolagent ~]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-11-21 08:03:56 CST; 31min ago
Main PID: 791 (atd)
CGroup: /system.slice/atd.service
└─791 /usr/sbin/atd -f
Nov 21 08:03:56 patrolagent systemd[1]: Started Job spooling tools.
Nov 21 08:03:56 patrolagent systemd[1]: Starting Job spooling tools...
[root@patrolagent ~]#
at依赖系统运行桩体, 当系统处于指定时间段内未启动(例如处于睡眠模式或停机状态)时, 该定时任务不会被执行, 不触发相应的补偿机制.
2.at时间表达
at支持多种时间格式,这些格式可以表达您希望任务执行的确切时间:
hh:指定时和分(E.g:14:00)。
midnight:午夜(00:00)。
noon:中午(12:00)。
teatime:下午(16:00)。
tomorrow:明天的同一时间。
now +[time]:从当前时间开始便宜(E.g:now +2 hours OR now +1 day)。
指定具体时间:
at 14:00
指定相对时间:
at now +1 hour
at now +2 hours
at now +3 days
指定具体日期:
at 8:00 AM tomorrow
at 10:00 AM 12/22/2024 #month/day/year
3.at用法
用法:
at [time] [options]
| 参数 | 说明 |
|---|---|
| -f | 从文件中读取命令。 E.g:at -f /path/script 15:00 |
| -l | 列出当前用户的所有任务。 |
| -d | 删除指定任务。 |
at定时计划任务示例:
[root@patrolagent ~]# at 9:10
at> sh /root/grep.sh > /dev/pts/0
at> <EOT>
job 16 at Thu Nov 21 09:10:00 2024
[root@patrolagent ~]#
OR
[root@patrolagent ~]# at 9:10
at> sh /root/grep.sh > $(tty)
at> <EOT>
job 16 at Thu Nov 21 09:10:00 2024
[root@patrolagent ~]#
备注:
在输入完要执行的命令后,按"Ctrl+D"结束输入,这样就会保存并调度任务。
如果你在输入命令时 希望取消任务,可以按"Ctrl+C"取消。
OR
[root@patrolagent ~]# at 9:15 <<< "sh /root/grep.sh > /dev/pts/0"
job 17 at Thu Nov 21 09:15:00 2024
[root@patrolagent ~]#
OR
[root@patrolagent ~]# at 9:15 <<< "sh /root/grep.sh > $(tty)"
job 17 at Thu Nov 21 09:15:00 2024
[root@patrolagent ~]#
备注:
运行在终端窗口的控制台界面,可以通过执行ty -s命令查看,并显示当前运行的终端窗口名称。
命令:
tty
[root@patrolagent ~]# tty
/dev/pts/0 #当前终端名
[root@patrolagent ~]#
任务执行输出:
[root@patrolagent ~]# node01 found in /root/1.txt
node01 found in /root/1.txt
[root@patrolagent ~]#
4.查看at任务的日志
at任务通常不会展示过多细节的输出。
它会将标准输出及标准错误信息传递给用户(前提是邮件服务已启用)。
建议检查/var/spool/mail/username或/var/mail/username目录以查看是否存在来自at任务的通知。
[root@patrolagent ~]# cat /var/spool/mail/root | grep node
node01 found in /root/1.txt
node01 found in /root/1.txt
node01 found in /root/1.txt
node01 found in /root/1.txt
node01 found in /root/1.txt
[root@patrolagent ~]#
5.检查at命令的执行日志
你还可以进一步查看系统日志文件(例如/var/log/syslog或/var/log/cron),这些记录详细列出了所有计划任务的执行情况,并且包括每个任务启动和完成的时间
[root@patrolagent ~]# cat /var/log/cron |grep grep.sh |tail -n 5
Nov 21 09:20:01 patrolagent CROND[6701]: (root) CMD (sh /root/grep.sh > /dev/pts/2)
Nov 21 09:21:01 patrolagent CROND[6774]: (root) CMD (sh /root/grep.sh > /dev/pts/2)
Nov 21 09:22:01 patrolagent CROND[6815]: (root) CMD (sh /root/grep.sh > /dev/pts/2)
Nov 21 09:23:01 patrolagent CROND[6862]: (root) CMD (sh /root/grep.sh > /dev/pts/2)
Nov 21 09:24:01 patrolagent CROND[6914]: (root) CMD (sh /root/grep.sh > /dev/pts/2)
[root@patrolagent ~]#
6.at任务说明
定时计划任务定义后,我们使用atq命令列出当前用户排定的at任务。
命令:
atq
[root@patrolagent ~]# atq
18 Thu Nov 21 11:00:00 2024 a root
[root@patrolagent ~]#
在输出中:
第一列 是任务ID(job_id)。
第二列 是任务的日期和时间。
第三列 是任务的队列标识,通常为a(表示系统队列)。
第四列 是用户名。
为了获取任务的详细信息, 我们可以使用at -c job_id这一命令. 其中, job_id是通过从atq输出中提取的任务ID.
命令:
at -c 18
[root@patrolagent ~]# at -c 18
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=58; export XDG_SESSION_ID
HOSTNAME=patrolagent; export HOSTNAME
SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
SHELL=/bin/bash; export SHELL
HISTSIZE=1000; export HISTSIZE
NLS_LANG=SIMPLIFIED\ CHINESE_CHINA.AL32UTF8; export NLS_LANG
SSH_CLIENT=192.168.10.1\ 56845\ 22; export SSH_CLIENT
SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
SSH_TTY=/dev/pts/0; export SSH_TTY
USER=root; export USER
LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib; export LD_LIBRARY_PATH
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
TNS_ADMIN=/usr/lib/oracle/11.2/client64/network/admin; export TNS_ADMIN
MAIL=/var/spool/mail/root; export MAIL
PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lib/oracle/11.2/client64/bin:/opt/msend/bin:/root/bin; export PATH
PWD=/root; export PWD
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64; export JAVA_HOME
LANG=en_US.UTF-8; export LANG
SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
HISTCONTROL=ignoredups; export HISTCONTROL
SHLVL=1; export SHLVL
HOME=/root; export HOME
LOGNAME=root; export LOGNAME
CLASSPATH=.:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/lib/dt.jar:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/lib/tools.jar; export CLASSPATH
SSH_CONNECTION=192.168.10.1\ 56845\ 192.168.10.100\ 22; export SSH_CONNECTION
LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
MCELL_HOME=/opt/msend; export MCELL_HOME
XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
ORACLE_HOME=/usr/lib/oracle/11.2/client64; export ORACLE_HOME
cd /root || {
echo 'Execution directory inaccessible' >&2
exit 1
}
${SHELL:-/bin/sh} << 'marcinDELIMITER46a2d26b'
sh /root/grep.sh > /dev/pts/0
marcinDELIMITER46a2d26b
[root@patrolagent ~]#
你可以使用atrm\ job\_id或at\ -d\ job\_id命令来进行删除操作
命令:
atrm 18
OR
at -d 18
[root@patrolagent ~]# atq
18 Thu Nov 21 11:00:00 2024 a root
[root@patrolagent ~]# at -d 18
[root@patrolagent ~]# atq
[root@patrolagent ~]#
7.at权限
关于at权限,了解即可,因为在实际过程中,有99.99%的概率是使用不到。
at.allow 和 at.deny 是用于决定用户能否使用 at 命令的关键性配置文件。详细说明它们各自的优先级及应用领域:
文件位置
at.allow:通常位于/etc/at.allow。默认不存在,需手工定义。
at.deny:通常位于/etc/at.deny。
优先级规则
at允许的优先等级比atdeny高, 即当用户将某些内容加入到allow列表时, 即使他们也在deny列表中有相应的设置
当一个用户同时存在于 at.allow 和 at.deny 时,在这种情况下 at.allow 中的条目将按照优先级进行处理,并且这个用户依然允许他使用 at 命令。
行为描述
at.allow:
如果存在at.allow文件,只有文件中列出的用户才可以使用at命令。
如果at.allow文件不存在,则at.deny文件起作用。
at.deny:
如果没有at.allow文件存在,at.deny文件中的用户会被禁止使用at命令。
当at.deny文件存在且at.allow文件无存时,则表示属于at.deny文件范围内的用户将无法调用at命令。
at.allow/at.deny示例
1.at.allow存在,at.deny不存在:
只有at.allow中列出的用户可以使用at,其他用户无法使用。
/etc/at.deny文件为空或不存在。
2.at.allow和 at.deny都存在:
只要用户同时拥有access.txt中的both permissions字段,并且也拥有access.txt中的deny permission字段,在这种情况下系统依然会允许其访问资源。这是因为,在这种情况下系统会按照priority order处理这两个权限。
3.at.allow不存在,at.deny存在:
只有at.deny中没有列出的用户可以使用at,列出的用户将被禁止使用。
总结
1).at.allow文件的优先级高于at.deny 文件。
2).如果at.allow不存在,at.deny文件中的用户将被禁止使用at命令。
3).如果at.allow存在,只有它列出的用户能够使用at命令。
