Linux学习之路-Linux-at及cron命令【7】---20171215

痴心易碎 提交于 2019-12-03 13:22:49

Linux学习之路-Linux-at及cron命令【7】---20171215

ntpdate 命令

[root@Centos6~]#ntpdate 172.18.0.1                     -------->ntpdate 命令跟服务器同步时间
18 Dec 21:16:25 ntpdate[7932]: step time server 172.18.0.1 offset 412750.511124 sec
[root@Centos6~]#date
2017年 12月 18日 星期一 21:16:35 CST
[root@Centos6~]#ll /usr/bin/at
-rwsr-xr-x. 1 root root 54464 3月  22 2017 /usr/bin/at                 -------->具有SUID权限

cron 命令

  • 周期性任务计划:cron

    相关的程序包:

  • cronie: 主程序包,提供crond守护进程及相关辅助工具

    Cronie包含在预定时间运行指定程序的标准UNIX守护进程crond和相关工具。 它是原来的vixie-cron的一个分支,并具有像使用pam和SELinux一样的安全和配置增强功能

  • cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务

    anacron是cronie的一部分,用于定期运行的工作,没有确切的执行时间。anacron的默认设置执行每日,每周和每月的工作,但是anacron允许设置任意的工作周期。使用anacron可以运行周期性作业,即使系统经常关闭,也可以随机执行作业执行时间,以更好地利用多个系统之间共享的资源

  • crontabs:包含CentOS提供系统维护任务

    fedora主要使用这个包来通过cron来执行文件。crontabs软件包包含root crontab文件和目录。将需要安装cron守护进程以从crontabs运行作业。cron守护程序(如cronie或fcron)会检查crontab文件以查看特定命令何时执行。 如果命令被安排,它执行它们。Crontabs处理一个基本的系统功能,所以它应该安装在系统上

    [root@Centos6~]#cat /etc/crontab                                              ----------->查看系统计划任务文件内容格式
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin                                               ---------->PATH变量路径,所以建议可执行程序建议写全完整路径
    MAILTO=root
    HOME=/
    # For details see man 4 crontabs
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed
    11 10 * * * L wall hello
    [root@Centos6~]#cat /var/log/cron                                      ----------->查看日志文件
    ........
    Dec 19 10:11:01 Centos6 crond[2056]: (*system*) RELOAD (/etc/crontab)
    Dec 19 10:11:01 Centos6 CROND[8922]: (L) CMD (wall hello)
  • 注意:命令执行的日期可以由两个字段指定 - 日期和星期几。如果两个字段都受限制(即不是 * ),则当任一字段与当前时间匹配时,将运行该命令。
    例如,“30 4 1,15 * 5”将会在每个月的1号和15号以及每个星期五的凌晨4点30分执行命令。
    如果就想既是1,15号并且是星期5,就需要在计划任务后加脚本,在脚本内判断是否是星期5,如果是星期五在执行脚本,这样就能达到既是1,15号并且是星期5的需求
    [root@Centos6~]#day=`date +%w`;[ "$day" = "2" ] && echo 2                     ---------->判断今天是否是星期2
    2
  • 计划任务时间表示法

    1) 特定值:给定时间点有效取值范围内的值
    2) */10 给定时间点上有效取值范围内的所有值 表示“每...”
    3) 离散取值 :1,3,4
    4) 连续取值 :1-5
    5) 在指定时间范围上:定义步长 /#: #即为步长
    6) 用'@'字符修正:
           @reboot: 重启后运行一次。
           @yearly: 每年运行一次,即。 0 0 1 1 
           @annually:每年运行一次,即。 0 0 1 1 

           @monthly: 每月运行一次,即。 0 0 1 
           @周: 每周运行一次,即。 0 0 0
           @daily: 每天运行一次, 即。 0 0 
           @hourly: 每小时运行一次,即。 0 

    示例: 0 
    /3 * centos /bin/echo “howdy”;/usr/bin/wall “welcome!” --------->每3小时echo和wall命令

    [root@Centos6app]#vim /etc/crontab 
    0 1 * * * root /bin/tar Jcf /app/backup`date +\%F -d "-1 day"`.tar.xz /etc &>/dev/null                 ------->%需要转义
    [root@Centos6app]#ll -h
    -rw-r--r--. 1 root root 6.2M 12月 19 01:00 backup2017-12-18.tar.xz
    [root@Centos6app]#cat /var/log/cron
    Dec 19 01:00:01 Centos6 CROND[10418]: (root) CMD (/bin/tar Jcf /app/backup`date +%F -d "-1 day"`.tar.xz /etc &>/dev/null)
    **注意:对于cron任务来讲,% 有特殊用途;如果在命令中要使用 %, 则需要转义,将 % 放置于单引号中,则可不用转义**
  • 确保crond守护处于运行状态:

    CentOS 7:systemctl status crond 
    CentOS 6:service crond status

    [root@Centos7~]#service crond status                                                        -------这条旧命令其实引用的就是/bin/systemctl status crond.service 这条命令
    Redirecting to /bin/systemctl status crond.service
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 955 (crond)
    CGroup: /system.slice/crond.service
    └─955 /usr/sbin/crond -n
    [root@Centos7~]#systemctl status crond.service atd
    ● crond.service - Command Scheduler
    Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 955 (crond)
    CGroup: /system.slice/crond.service
    └─955 /usr/sbin/crond -n
    12月 17 16:21:13 Centos7.L systemd[1]: Started Command Scheduler.
    12月 17 16:21:13 Centos7.L systemd[1]: Starting Command Scheduler...
    12月 17 16:21:13 Centos7.L crond[955]: (CRON) INFO (RANDOM_DELAY will be scaled with f...d.)
    12月 17 16:21:14 Centos7.L crond[955]: (CRON) INFO (running with inotify support)
    ● atd.service - Job spooling tools
    Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
    Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 5h ago
    Main PID: 958 (atd)
    CGroup: /system.slice/atd.service
    └─958 /usr/sbin/atd -f
    12月 17 16:21:13 Centos7.L systemd[1]: Started Job spooling tools.
    12月 17 16:21:13 Centos7.L systemd[1]: Starting Job spooling tools...
    Hint: Some lines were ellipsized, use -l to show in full.

系统的计划任务

  • anacron系统

    运行计算机关机时cron不运行的任务,CentOS6以后版本 取消anacron服务,由crond服务管理
    对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其 它不一直开机的系统很重要对很有用
    配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。

    字段1:如果在这些日子里没有运行这些任务...... 
    字段2:在重新引导后等待这么多分钟后运行它 
    字段3:任务识别器,在日志文件中标识
    字段4:要执行的任务

    由/etc/cron.hourly/0anacron执行
    当执行任务时,更新/var/spool/anacron/cron.daily 文件 的时间戳

    [root@Centos6anacron]#cat /etc/anacrontab                                 --------> 查看anacrontab配置文件信息
    #/etc/anacrontab: configuration file for anacron
    #See anacron(8) and anacrontab(5) for details.
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    #the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    #the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22
    #period in days      delay in minutes       job-identifier                  command
    1                               5                       cron.daily              nice run-parts /etc/cron.daily
    7                              25                     cron.weekly           nice run-parts /etc/cron.weekly
    @monthly                     45                       cron.monthly            nice run-parts /etc/cron.monthly`
/etc/crontab                                            ----------> 计划任务的总配置文件,只有root用户可以直接使用
[root@Centos6~]#ll /etc/crontab 
-rw-r--r--. 1 root root 456 12月 19 01:02 /etc/crontab

/etc/cron.d/ 配置文件                             ----------->计划任务配置文件存放的位置,不建议全部都在/etc/crontab 文件中修改,以免因任务过多,导致错乱
[root@Centos6profile.d]#ll /etc/cron.d/
-rw-r--r--. 1 root root 113 8月  24 2016 0hourly
-rw-------. 1 root root 108 1月  26 2017 raid-check
-rw-------. 1 root root 235 3月  22 2017 sysstat

/etc/cron.hourly/                                                 ----------->  每小时需要执行的计划任务存放位置,0anacron脚本就是anacron服务的配置文件,
[root@Centos6~]#ll /etc/cron.hourly/                                      因关机没有执行的计划任务,开机后每小时检查一次,然后继续执行相关计划任务
-rwxr-xr-x. 1 root root 409 8月  24 2016 0anacron
[root@Centos6~]#cat /etc/cron.hourly/0anacron 
#!/bin/bash
# Skip excecution unless the date has changed from the previous run 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi
# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

/etc/cron.daily/                  ----------->系统每天要执行的计划任务,这些计划任务都是软件安装时自动形成的脚本,需要系统每天执行的任务就会放到这个文件夹内
[root@Centos6profile.d]#ll /etc/cron.daily/
-rwx------. 1 root root  118 3月  22 2017 cups
-rwx------. 1 root root  180 7月  10 2003 logrotate
-rwx------. 1 root root  927 3月  22 2017 makewhatis.cron
-rwx------. 1 root root  189 1月  26 2015 mlocate.cron
-rwxr-xr-x. 1 root root 2126 7月  19 2013 prelink
-rwxr-xr-x. 1 root root  563 11月 23 2013 readahead.cron
-rwxr-xr-x. 1 root root  433 11月  7 2015 tmpwatch

/etc/cron.weekly/                            ----------->      每星期需要执行的计划任务存放位置
/etc/cron.monthly/                          ----------->      每月期需要执行的计划任务存放

[root@Centos6profile.d]#ll /etc/cron
cron.d/       cron.deny     cron.monthly/ cron.weekly/
cron.daily/   cron.hourly/  crontab    

管理临时文件

  • CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
  • CentOS7使用systemd-tmpfiles-setup服务实现
  • 配置文件

    /etc/tmpfiles.d/.conf 
    /run/tmpfiles.d/
    .conf 
    /usr/lib/tmpfiles/*.conf

  • /usr/lib/tmpfiles.d/tmp.conf

    d /tmp 1777 root root 10d
    d /var/tmp 1777 root root 30d

  • 命令:

    systemd-tmpfiles –clean|remove|create configfile

corntab 命令:用户cron计划任务

  • crontab命令定义,每个用户都有专用的cron任务文件

    /var/spool/cron/USERNAME

  • crontab命令:

    用法:crontab [-u user] [-l | -r | -e] [-i] 
    常用选项
    -l: 列出所有任务;
    -e: 编辑任务;
    -r: 移除所有任务; -i:同-r一同使用,以交互式模式移除指定任务 
    -u user: 仅root可运行,指定用户管理cron任务

  • 控制用户执行计划任务: /etc/cron.{allow,deny}
    [root@Centos6~]#ls /var/spool/cron/L                   --------->普通用户存放cron计划任务配置文件的位置
    /var/spool/cron/L
    [root@Centos6~]#crontab -l -u L                            --------->-l 选项只能查看自己的配置文件信息,如果需要查询他人的,需要加-u 选项
    * * * * * wall hello                                                     ---------> **配置内容不需要增加用户信息这项**
    [root@Centos6cron]#ll /usr/bin/crontab               ---------->**crontab 命令具有SUID权限**
    -rwsr-xr-x. 1 root root 51784 8月  24 2016 /usr/bin/crontab
    [root@Centos6anacron]#vim /etc/profile.d/env.sh       --------> 默认crontab -e 配置内容使用的vi软件,不具有vim功能,故可以修改默认的软件设置。
    export EDITOR=vim
    [root@Centos6~]#ll /var/spool/cron/ -d
    drwx------. 2 root root 4096 12月 19 14:55 /var/spool/cron/

at 命令

  • at、batch 命令是从标准输入或指定的文件中读取,将在稍后执行的命令
  • batc命令将在系统负载水平下降到特定水平时执行命令
  • atq 命令列出用户的待处理作业,除非用户是超级用户;在这种情况下,每个人的工作都被列出来了。
  • atrm 命令删除由工作号码标识的工作
[root@Centos6~]#chkconfig --list atd                                                         --------> Centos6 上查看at命令是否开机自动启动
atd             0:关闭    1:关闭    2:关闭    3:启用    4:启用    5:启用    6:关闭
[root@Centos6~]#runlevel
5 3
[root@Centos6~]#chkconfig atd on                                                           -------->如果不是开机启动,就用这条命令设置为开机启动
[root@Centos7~]#systemctl is-enabled atd.service                                 --------->Centos7 上查看at命令是否开机启动
enabled
[root@Centos7~]#systemctl enable atd
  • 执行方式:
  • 1)交互式 2)输入重定向 3)at –f 文件
  • 依赖与atd服务,需要启动才能实现at任务
  • at队列存放在/var/spool/at目录中
[root@Centos7~]#systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2017-12-17 16:21:13 CST; 1 day 4h ago
 Main PID: 958 (atd)
   CGroup: /system.slice/atd.service
           └─958 /usr/sbin/atd -f                           ----------> 调用的就是/usr/sbin/atd 这个程序,958就是PID
[root@Centos7~]#ps aux | grep atd
root        958  0.0  0.0  25856   916 ?        Ss   16:09   0:00 /usr/sbin/atd -f
[root@Centos6~]#at 21:25                                  ---------->交互式用法
at> wall ready to off work
at> <EOT>
job 1 at 2017-12-18 21:25
[root@Centos6~]#at -l
1   2017-12-18 21:25 a root
[root@Centos6~]#ls /var/spool/at/ -l
-rwx------. 1 root   root   3232 12月 18 21:21 a000010180ede5          --------->执行后就会自动删除文件
drwx------. 2 daemon daemon 4096 3月  22 2017 spool
[root@Centos6~]#at 21:27
at> hostname                                                                                        --------->计划任务无法打印标准输出内容,执行成功后的信息以邮件方式发给发起者
at> <EOT>
job 3 at 2017-12-18 21:27
[root@Centos6~]#hostname
Centos6.L
You have mail in /var/spool/mail/root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root                  Mon Dec 18 21:27  14/421   "Output from your job        3"
& 1
Message  1:
From root@Centos6.L  Mon Dec 18 21:27:01 2017
Return-Path: <root@Centos6.L>
X-Original-To: root
Delivered-To: root@Centos6.L
Subject: Output from your job        3
To: root@Centos6.L
Date: Mon, 18 Dec 2017 21:27:01 +0800 (CST)
From: root@Centos6.L (root)
Status: R
Centos6.L                                                                             ---------> at命令执行成功的信息,所以计划任务以及脚本建议标准输出直接到&>/dev/null
& 
[root@Centos6~]#at 21:37 <<EOF                                       --------->在脚本中可以使用这样方法输入配置
> wall Good night!                                                                --------->但建议把脚本的路径添加上,因为默认的PASH变量路径可能有一定出入
> EOF
job 5 at 2017-12-18 21:37
[root@Centos6~]#at -c 5                                                      --------->查看at计划任务的信息
#!/bin/sh
# atrun uid=0 gid=0
..........
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin; export PATH      ------->变量地址
${SHELL:-/bin/sh} << 'marcinDELIMITER3692b1dd'
wall Good night!
marcinDELIMITER3692b1dd
[root@Centos6~]#echo -e "wall at job3\nwall at jobs4\nwall at jobs5"| at 21:45
job 6 at 2017-12-18 21:45
[root@Centos6~]#at -l
6   2017-12-18 21:45 a root
[root@Centos6~]#at -c 6
........
wall at job3
wall at jobs4
wall at jobs5
[root@Centos6~]#at 21:48 -m                       ----------->发送邮件确认
at> how are you
at> <EOT>
job 7 at 2017-12-18 21:48
[root@Centos6~]#at -l
7   2017-12-18 21:48 a root
[root@Centos6~]#mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 2 messages 1 new
>N  2 root                  Mon Dec 18 21:48  14/453   "Output from your job        7"
& 2
......
Subject: Output from your job        7                  --------->来自第7个计划任务
  • at.allow (白名单)、at.deny(黑名单)

    超级用户可以在任何情况下使用这些命令。对于其他用户,使用的权限由文件/etc/at.allow和/etc/at.deny确定
    如果文件/etc/at.allow存在,则只允许在其中提及的用户名在
    如果/etc/at.allow不存在,则检查/etc/at.deny,然后允许在其中未提及的每个用户名使用at
    如果不存在,则只允许超级用户使用 at 命令,一个空的/etc/at.deny意味着每个用户都可以使用这些命令,这是默认配置

[root@Centos6~]#cat /etc/at.deny                    ---------->默认黑名单为空,所有用户都可以用at命令制定计划任务

[root@Centos6~]#cat /etc/at.allow                   ---------->默认没有白名单这个文件,如果使用需要手工创建
cat: /etc/at.allow: 没有那个文件或目录
  • 常用参数

    -m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
    -M 永远不会发送邮件给用户
    -f 从指定的文件读取作业而不是标准输入
    -l 是atq的别名
    -r 是atrm的别名
     -d 是atrm的别名
     -v 显示在阅读作业之前作业将被执行的时间。显示的时间将采用格式“Thu Feb 20 14:50:00 1997”
      -c 将命令行上列出的作业捕获到标准输出(查看具体的作业任务)

  • 示例
  • at命令接受HH:MM形式的时间在一天的特定时间托管一个工作。(如果时间已经过去,则假定是第二天)。
  • 也可以指定午夜,中午或下午茶时间(下午4点),并且可以在上午或下午晚间。
  • 也可以通过在选择年份的月份名称日期中给出日期,或者给出MMDDYY或MM / DD / YY或DD.MM.YY或YYYY的日期来说明工作将在哪一天运行-MM-DD。
  • 日期的规格必须遵循当天的规格。也可以给出像现在这样的时间+计算时间单位,其中时间单位可以是几分钟,几小时,几天或几周,

HH:MM 02:00

在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务

HH:MM YYYY-MM-DD 02:00 2016-09-20

规定在某年某月的某一天的特殊时刻进行该项任务

HH:MM[am|pm] [Month] [Date]

04pm March 17 
17:20 tomorrow

HH:MM[am|pm] + number [minutes|hours|days|weeks]

在某个时间点再加几个时间后才进行该项任务
now + 5 minutes
02pm + 3 days

at和crontab 对比

  • 一次性作业使用 at
  • 重复性作业使用crontab
    Create           at time                        crontab -e
    List                at -l                             crontab -l 
    Details           at -c jobnum               N/A 
    Remove         at -d jobnum               crontab -r 
    Edit                N/A                              crontab -e
  • 没有被重定向的输出会被邮寄给用户
  • 根用户能够修改其它用户的作业
  • 注意:运行结果的标准输出和错误以邮件通知给相关用户

    (1) COMMAND > /dev/null
    (2) COMMAND &> /dev/null

  • 对于cron任务来讲,%有特殊用途;如果在命令中要使用%, 则需要转义,将%放置于单引号中,则可不用转义

 

* 1) 如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
* 2) 如何实现每7分钟运行一次任务? 
* sleep命令:
          sleep NUMBER[SUFFIX]... 
                          SUFFIX:
                                 s: 秒, 默认 m: 分
                                 h: 小时
                                 d: 天

并行运行

  • 同时运行多个进程,提高效率

    方法1

    vi all.sh f1.sh& f2.sh& f3.sh&

    方法2

    (f1.sh&);(f2.sh&);(f3.sh&)

    方法3

    { f1.sh& f2.sh& f3.sh& }

 1、每天的2点和12点整,将/etc备份至/testdir/backup目 录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”
 0 2,12 * * * root /bin/tar Jcf /testdir/backup/etcbak`date +\%Y-\%m-\%d-\%H`.tar.xz /etc &>/dev/null

 2、每周2, 4, 7备份/var/log/messages文件至/logs目录中 ,文件名形如“messages-yyyymmdd”
0 0 * * 2,4,7 root /bin/tar Jcf /logs/messages-`date +\%F` /var/log/messages &>/dev/null

 3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * root cat /proc/meminfo | egrep "^S|^M" >> /tmp/meminfo.txt

 4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现 任何分区利用率高于80%,就执行wall警报
*/10 0 * * 1-5 root /app/disk.sh                     -------->因命令内容过多,建议写到一个简单脚本中,脚本内容如下
/app/disk.sh
disk=`df | grep "/dev/sd" | sort -r | head -n1`
[ "$disk" > 80% ] && wall "disk will be full"
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!