zoukankan      html  css  js  c++  java
  • Linux实施一次性任务

    一、定义

    at命令:定时任务,指定一个时间执行一个任务,只能执行一次。

    二、选项

    三、示例

    1. 使用 student 用户,创建一个任务,2 分钟以后执行,在/home/student/at.txt(如果不存在,就创建)中追加一行,内容是 date 命令输出结果

    [student@desktop1 ~]$ at now +2minutes
    at> echo $(date) >> /home/student/at.txt
    at> <EOT>
    job 10 at Thu Nov 3 11:20:00 2016

    2. 用 atq 检查 student 用户的任务列表,可看到上一步的任务 

    [student@desktop1 ~]$ atq
    10 Thu Nov 3 11:20:00 2016 a student

    3. 删除上一步创建的任务,并查看

    [student@desktop1 ~]$ atrm 10
    [student@desktop1 ~]$ atq
    [student@desktop1 ~]$ 

    4. 切换到root用户,创建root用户的一次性任务,打印“$USER $(date)”的输出追加 到/home/student/at.txt 文件中

    然后回到 student 用户,用 atq 检查任务,他是无法看到 root(其他用户的)的任务的 

    [root@desktop1 ~]# at now +2minutes
    at> echo $USER $(date) >> /home/student/at.txt
    at> <EOT>
    job 11 at Thu Nov  3 11:23:00 2016
    [root@desktop1 ~]# su - student 
    Last login: Thu Nov  3 10:29:07 CST 2016 on pts/0
    [student@desktop1 ~]$ atq
    [student@desktop1 ~]$

    5. student 也创建一个任务,2 分钟后执行,执行的操作和步骤 4 一样,现在 2 个用户(root和student)都有任务等待执行

    [student@desktop1 ~]$ at now +2minutes
    at> echo $USER $(date) >> /home/student/at.txt
    at> <EOT>
    job 12 at Thu Nov  3 11:26:00 2016
    [student@desktop1 ~]$ 

    6.用 root 用户执行 atq 检查任务,root 用户是可以看到所有用户的任务的 

    [root@desktop1 ~]# atq
    11    Thu Nov  3 11:38:00 2016 a root
    12    Thu Nov  3 11:39:00 2016 a student

    7. 回到student用户,该用户只能查看自己的任务

    [student@desktop1 ~]$ atq
    12    Thu Nov  3 11:39:00 2016 a student

    8 切换到 root 用户,删除前面创建的 2 个任务,确保 at 列表是空的 

    [root@desktop1 ~]# atrm 13
    [root@desktop1 ~]# atrm 14
    [root@desktop1 ~]# atq
    [root@desktop1 ~]# 

    9. 使用 student 用户,创建一个任务,在今年的 12 月 31 日,上午 10 点,执行 reboot 命令

    [student@desktop1 ~]$ at 10am Dec 31 2016
    at> reboot
    at> <EOT>
    job 15 at Sat Dec 31 10:00:00 2016
    [student@desktop1 ~]$ 

    10. 使用 student 用户,创建一个任务,10 小时后执行,重启 sshd 服务 

    [student@desktop1 ~]$ at now +10hours
    at> systemctl restart sshd
    at> <EOT>
    job 16 at Thu Nov  3 21:41:00 2016
    [student@desktop1 ~]$ 

    11. 使用 student 用户,创建一个任务,3 天后的下午 10 点执行,重启 rsyslogd 服务 

    [student@desktop1 ~]$ at 10pm +3days
    at> systemctl restart rsyslogd.service
    at> <EOT>
    job 17 at Sun Nov  6 22:00:00 2016
    [student@desktop1 ~]$ 

    12. 使用 student 用户,创建一个任务,2016 年 12 月 31 日(用 MMDDCCYY 表示)的 23: 59 分,执行 poweroff 命令

    [student@desktop1 ~]$ at 23:59 12312016
    at> poweroff
    at> <EOT>
    job 18 at Sat Dec 31 23:59:00 2016
    [student@desktop1 ~]$ 

    13. 检查最后一个任务的执行脚本,看到最后的 shell 命令即可 

    [student@desktop1 ~]$ at -c 18
    #!/bin/sh
    # atrun uid=1000 gid=1000
    # mail root 0
    umask 2
    XDG_VTNR=1; export XDG_VTNR
    XDG_SESSION_ID=1; export XDG_SESSION_ID
    HOSTNAME=desktop1.example.com; export HOSTNAME
    SHELL=/bin/bash; export SHELL
    HISTSIZE=1000; export HISTSIZE
    USER=student; export USER
    LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;2
    ...
    8;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:; export LS_COLORS MAIL=/var/spool/mail/student; export MAIL PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/student/.local/bin:/home/student/bin; export PATH PWD=/home/student; export PWD LANG=en_US.UTF-8; export LANG HISTCONTROL=ignoredups; export HISTCONTROL SHLVL=1; export SHLVL XDG_SEAT=seat0; export XDG_SEAT HOME=/home/student; export HOME LOGNAME=student; export LOGNAME LESSOPEN=||/usr/bin/lesspipe.sh %s; export LESSOPEN cd /home/student || { echo 'Execution directory inaccessible' >&2 exit 1 } ${SHELL:-/bin/sh} << 'marcinDELIMITER5d48d7d0' poweroff marcinDELIMITER5d48d7d0

    14. 检查/var/spool/at 目录也能看到上面的脚本

    [root@desktop1 ~]# ll /var/spool/at/
    total 16
    -rwx------. 1 student student 2972 Nov  3 11:40 a0000f01792f38
    -rwx------. 1 student student 2988 Nov  3 11:41 a000100177ebb5
    -rwx------. 1 student student 3000 Nov  3 11:42 a000110177fca8
    -rwx------. 1 student student 2974 Nov  3 11:46 a000120179327f
    drwx------. 2 daemon  daemon     6 Nov  3 11:26 spool
    [root@desktop1 ~]# 

    15. 创建一个 y 队列的任务,时间是 3 分钟后(用确切时间如 11:55 表示),向/home/student/at.txt 文件追加 Y 字符 

    [root@desktop1 ~]# at -q y 11:55
    at> echo Y >> /home/student/at.txt
    at> <EOT>
    job 19 at Thu Nov  3 11:55:00 2016

    16. 创建一个 x 队列的任务,时间和上一步任务的时间完全一样,向/home/student/at.txt 文件追加 X 字符,模拟同一时刻有 2 个任务需要执行

    [root@desktop1 ~]# at -q x 11:55
    at> echo X >> /home/student/at.txt
    at> <EOT>
    job 20 at Thu Nov  3 11:55:00 2016

    17. 用 atq 检查 2 个任务,确认时间是一样的,队列分别是 y 和 x 

    [root@desktop1 ~]# atq
    15    Sat Dec 31 10:00:00 2016 a student
    16    Thu Nov  3 21:41:00 2016 a student
    17    Sun Nov  6 22:00:00 2016 a student
    18    Sat Dec 31 23:59:00 2016 a student
    19    Thu Nov  3 11:55:00 2016 y root
    20    Thu Nov  3 11:55:00 2016 x root

    18. 等到 x 和 y 队列的 2 个任务执行后(过了他们的执行时间),用 tail 命令检查 /home/student/at.txt 文件,看到 X 在上面,

    Y 在下面,说明先执行的 x 队列后执行 y 队 列(同一时刻有 2 个任务,队列的字母排在前面的先执行)

    [root@desktop1 ~]# tail /home/student/at.txt 
    root Thu Nov 3 11:23:00 CST 2016
    X
    Y
    [root@desktop1 ~]# 

    19. 用 root 用户,编辑/etc/at.deny , 使 student 用户没有创建一次性任务的权限 

    [root@desktop1 ~]# echo "student" >> /etc/at.deny
    [root@desktop1 ~]# su - student 
    Last login: Thu Nov  3 11:40:00 CST 2016 on pts/0
    [student@desktop1 ~]$ at now +3hours
    You do not have permission to use at.
    [student@desktop1 ~]$ 

    20. 用 root 用户,创建和边界/etc/at.allow ,授予 student 用户创建一次性任务的权限,

    现在 student 是可以用 at 命令的,因为 at.allow 优先于 at.deny

    [root@desktop1 ~]# echo "student" >> /etc/at.allow
    [root@desktop1 ~]# su - student 
    Last login: Thu Nov  3 12:33:24 CST 2016 on pts/0
    [student@desktop1 ~]$ at now +3hours
    at> <EOT>
    job 22 at Thu Nov  3 15:34:00 2016
    [student@desktop1 ~]$ 

     

     

  • 相关阅读:

    暴力求解/数学问题
    Leetcode207. Course Schedule
    Balanced Team
    由先序和中序求后序
    Median String
    树的同构
    uva 202
    整除光棍
    阅览室
  • 原文地址:https://www.cnblogs.com/tdcqma/p/6026108.html
Copyright © 2011-2022 走看看