• Linux|奇怪的知识|一次性任务at命令的使用


    前言:

    at命令是Linux的一个专有命令,该命令是旧的计划任务atd服务的客户端命令(at命令是c/s形式的软件套件里的client,客户端),主要的用处就是灵活制定一个工作计划,特定时间自动完成你所设定的任务。

    好了,那么可能有老铁会说,这个at命令和crontab好像功能是重叠的,为什么还要了解这个命令呢?

    确实,crontab作为老牌计划任务无疑还是功能比较强大的,但,at命令比crontab更为灵活,计划任务的时间范围可能会有一个比较宽泛的设定,能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的,但十分口语化的词语来指定时间因此,会填补crontab的某些应用场景,不过at只能执行一次任务,例如,某些日志需要每天都清理,at是做不到重复的执行的,而crontab是可以执行重复性的周期性的任务的。

    下面将就如何使用at命令来做一个可靠的计划任务来进行一个简单的讲解。

    一,

    at命令存在的形式

    at命令是atd服务的客户端,atd服务是一个守护进程。

    在centos7这些操作系统上,最小化安装没有at命令的,需要单独安装,安装命令为:

    yum install at -y

    安装完毕后,需要启动服务,命令为:

    systemctl enable atd && systemctl start atd

     

    atd服务的状态 

    1. [root@centos61 ~]# systemctl status atd
    2. ● atd.service - Job spooling tools
    3. Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
    4. Active: active (running) since Sun 2023-05-28 11:29:17 CST; 18min ago
    5. Main PID: 666 (atd)
    6. Memory: 260.0K
    7. CGroup: /system.slice/atd.service
    8. └─666 /usr/sbin/atd -f
    9. May 28 11:29:17 centos61 systemd[1]: Started Job spooling tools.
    10. May 28 11:29:17 centos61 systemd[1]: Starting Job spooling tools...

    二,

    计划任务的三要素

    其实,计划任务也是可以按照事件三要素来编写的,也就是时间,地点,事件。那么,具化在Linux系统中,无疑的,时间指的就是任务开始的时间,地点自然是本机了,事件就是任务了。

    那么,相对at命令来说,时间的设定是极为丰富的,例如,相对当前时间的10分钟后,today(今天),tomorrow(明天),midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点) ,minutes(分钟)、hours(小时)、days(天)、weeks(星期)等比较模糊的 词语来指定时间,用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。

    总的来说,at命令的时间设定更为接近人们的平常的时间概念,也就是说可以十分的口语化。

    at命令支持的任务也是比较多的,比如,shell脚本,命令,组合命令等等

    at所编排的任务执行完成后都会给自己发送一个本地邮件,例如,以root用户执行了某个任务,那么,任务完成后,root用户将会收到一个邮件,邮件存放位置通常为/var/spool/mail/root

    三,

    at任务示例

    需要说明一下,at命令通常的运行方式是交互模式,也就是先指定时间,然后写要执行的若干条任务,最后退出。

    1,

    一分钟后,查看/etc/passwd文件的内容

    1. [root@centos61 ~]# date
    2. Sun May 28 13:25:03 CST 2023
    3. [root@centos61 ~]# at now +1 minute
    4. at> cat /etc/passwd
    5. at> exit
    6. at> quit
    7. at>
    8. job 11 at Sun May 28 13:26:00 2023

    等待1分钟后,查看邮件,可以看到任务确实执行了:

    1. Subject: Output from your job 11
    2. To: root@centos61.localdomain
    3. Message-Id: <20230528052600.6CE9620C5D51@centos61.localdomain>
    4. Date: Sun, 28 May 2023 13:26:00 +0800 (CST)
    5. From: root@centos61.localdomain (root)
    6. root:x:0:0:root:/root:/bin/bash
    7. bin:x:1:1:bin:/bin:/sbin/nologin
    8. daemon:x:2:2:daemon:/sbin:/sbin/nologin
    9. adm:x:3:4:adm:/var/adm:/sbin/nologin
    10. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    11. sync:x:5:0:sync:/sbin:/bin/sync
    12. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    13. halt:x:7:0:halt:/sbin:/sbin/halt
    14. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    15. operator:x:11:0:operator:/root:/sbin/nologin
    16. games:x:12:100:games:/usr/games:/sbin/nologin
    17. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    18. nobody:x:99:99:Nobody:/:/sbin/nologin
    19. systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    20. dbus:x:81:81:System message bus:/:/sbin/nologin
    21. polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    22. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    23. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    24. apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
    25. postgres:x:1000:1000::/home/postgres:/bin/bash
    26. tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

    2,

    三分钟后,在root目录下touch一个名为fuck的文件

    1. [root@centos61 ~]# at now +3 minute
    2. at> touch /root/fuck
    3. at>
    4. job 12 at Sun May 28 13:31:00 2023
    5. [root@centos61 ~]# atq
    6. 12 Sun May 28 13:31:00 2023 a root

    3,

    明天的这个时间运行一次df命令,可以看到,该任务标号是14

    1. [root@centos61 ~]# at tomorrow
    2. at> df
    3. at>
    4. job 14 at Mon May 29 13:38:00 2023
    5. [root@centos61 ~]# atq
    6. 14 Mon May 29 13:38:00 2023 a root

    查看14号任务(具体任务在最后面,前面都是环境变量什么的,没什么可看的):

    1. [root@centos61 ~]# at -c 14
    2. #!/bin/sh
    3. # atrun uid=0 gid=0
    4. # mail root 0
    5. umask 22
    6. XDG_SESSION_ID=1; export XDG_SESSION_ID
    7. HOSTNAME=centos61; export HOSTNAME
    8. SELINUX_ROLE_REQUESTED=; export SELINUX_ROLE_REQUESTED
    9. SHELL=/bin/bash; export SHELL
    10. HISTSIZE=1000; export HISTSIZE
    11. SSH_CLIENT=192.168.123.1\ 49853\ 22; export SSH_CLIENT
    12. SELINUX_USE_CURRENT_RANGE=; export SELINUX_USE_CURRENT_RANGE
    13. SSH_TTY=/dev/pts/0; export SSH_TTY
    14. USER=root; export USER
    15. 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
    16. MAIL=/var/spool/mail/root; export MAIL
    17. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/pgsql/bin:/opt/pgsql/data:/root/bin; export PATH
    18. PWD=/root; export PWD
    19. LANG=en_US.UTF-8; export LANG
    20. SELINUX_LEVEL_REQUESTED=; export SELINUX_LEVEL_REQUESTED
    21. PGHOME=/opt/pgsql; export PGHOME
    22. HISTCONTROL=ignoredups; export HISTCONTROL
    23. SHLVL=1; export SHLVL
    24. HOME=/root; export HOME
    25. LOGNAME=root; export LOGNAME
    26. SSH_CONNECTION=192.168.123.1\ 49853\ 192.168.123.61\ 22; export SSH_CONNECTION
    27. PGDATA=/opt/pgsql/data; export PGDATA
    28. LESSOPEN=\|\|/usr/bin/lesspipe.sh\ %s; export LESSOPEN
    29. XDG_RUNTIME_DIR=/run/user/0; export XDG_RUNTIME_DIR
    30. cd /root || {
    31. echo 'Execution directory inaccessible' >&2
    32. exit 1
    33. }
    34. ${SHELL:-/bin/sh} << 'marcinDELIMITER5f46f2f8'
    35. df
    36. marcinDELIMITER5f46f2f8

    4,

    指定当天的某个时间执行一次  ls /opt/

    1. [root@centos61 ~]# at 14:51
    2. at> ls /opt
    3. at>
    4. job 16 at Sun May 28 14:51:00 2023

    5,

    指定一个具体时间,执行任务:

    很显然,现在是2023 ,2020年是不可接受的时间

    1. [root@centos61 ~]# at 19:19 2020-05-13
    2. at: refusing to create job destined in the past

    未来的时间是可以接受的:

    1. [root@centos61 ~]# at 19:19 2023-05-31
    2. at>
    3. job 17 at Wed May 31 19:19:00 2023

    6,

    午夜任务(这里的午夜是指的零点了,今天是星期天,任务的开始时间是星期一7)

    1. [root@centos61 ~]# at midnight
    2. at> ls /opt
    3. at>
    4. job 18 at Mon May 29 00:00:00 2023

    7,

    星期任务(星期三,当前时间执行的任务)

    1. root@centos61 ~]# at Wednesday
    2. at>
    3. job 19 at Wed May 31 14:59:00 2023
    4. [root@centos61 ~]# date
    5. Sun May 28 14:59:54 CST 2023

    8,

    明天下午两点33分的任务:

    1. [root@centos61 ~]# at 02:33PM tomorrow
    2. at>
    3. job 20 at Mon May 29 14:33:00 2023

    9,

    一分钟后执行启动postgresql的脚本:

    1. [root@centos61 ~]# at -f start-pg.sh now +1 minute
    2. job 22 at Sun May 28 16:03:00 2023

    查看是否执行了脚本(多说一句,脚本不需要执行权限,因为at命令调用的就是 /bin/sh):

    1. [root@centos61 ~]# ls -l start-pg.sh
    2. -rw-r--r--. 1 root root 52 May 20 17:34 start-pg.sh
    3. [root@centos61 ~]# tail /var/spool/mail/root
    4. waiting for server to start....2023-05-28 16:03:00.791 CST [21108] LOG: starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit
    5. 2023-05-28 16:03:00.795 CST [21108] LOG: listening on IPv4 address "0.0.0.0", port 35432
    6. 2023-05-28 16:03:00.795 CST [21108] LOG: listening on IPv6 address "::", port 35432
    7. 2023-05-28 16:03:00.805 CST [21108] LOG: listening on Unix socket "/tmp/.s.PGSQL.35432"
    8. 2023-05-28 16:03:00.863 CST [21109] LOG: database system was shut down at 2023-05-28 00:00:17 CST
    9. 2023-05-28 16:03:00.890 CST [21108] LOG: database system is ready to accept connections
    10. done
    11. server started

  • 相关阅读:
    (一)DepthAI-python相关接口:OAK Device
    Ansible 简介安装
    RHCE8 资料整理(七)
    用matlab编写了一个DSP数据处理小软件
    数据结构题型7-删除结点方式1
    8-4 Prometheus服务发现
    【scikit-learn基础】--『回归模型评估』之准确率分析
    php魔术方法和反序列化漏洞
    刨根问底 Redis, 面试过程真好使
    单链表
  • 原文地址:https://blog.csdn.net/alwaysbefine/article/details/130910905