Advertisement

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\_idat\ -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命令。

全部评论 (0)

还没有任何评论哟~