Day28-Linux系统定时任务

1. Linux系统定时任务

1.1 什么是【定时】任务?(what)

固定时间、或者周期性的执行一项任务。

生活中比喻:闹钟
每条早晨叫醒起床。周期性。
固定时间叫醒你。指定某一天某一时刻。

1.2 为什么要用定时任务?(why)

【用户随时都可能写数据】
1)每天0晨要备份数据库的数据,存储的数据。配置文件。/etc/hosts
运维人员改过的配置,软件配置,内核参数配置,用户存放的数据都需要备份。
2)数据报表统计。
3)定时发微信、邮件。
4)每分钟,每小时执行,人为没有精力的。

1.3 使用哪个定时任务工具?

  • at定时任务软件(依赖于atd服务)适合仅执行一次就结束的调度任务工作。例如:某天夜里需要处理一个工作任务,仅仅是这一天的夜里,属于突发性的工作任务,那就可以使用该软件。要使得at这个软件设定的配置生效,还需要提前启动一个名为atd的服务才行,这个工具在工作中的使用需求很少,读者简单了解一下即可。

  • cron定时任务软件依赖于crond服务。正如前面所说,通过crontab命令可以配置周期性执行的定时任务工作计划,例如:每五分钟做一次服务器时间同步。要使得crontab命令设定的配置生效,还需要先启动一个服务crond才行。这个cron工具(对应的crontab命令以及依赖的crond服务)是运维工程师在生产工作中最常用工具,请大家务必掌握。

  • anacron定时任务软件主要是为非7*24小时开机的服务器准备的,anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行任务工作。它会检测服务器停机期间应该执行但是并没有进行的任务工作,并将该任务执行一遍

使用cron定时任务
系统定时任务计划
crond 服务在工作时除了查看/var/spool/cron下的定时任务文件外,还会查看/etc/cron.d目录以及/etc/anacrontab下的文件内容,里面通常是每天、每周或每月需要执行的任务,如果有需要执行的任务就会执行,系统定时任务通常是如下路径:

[root@backup ~]# ls -l /etc |grep cron
-rw-------.  1 root root      541 516 2023 anacrontab
drwxr-xr-x.  2 root root       36 218 17:11 cron.d         #<==系统定时任务的目录。
drwxr-xr-x.  2 root root       42 218 16:33 cron.daily     #<==按天轮询配置的目录。
-rw-------.  1 root root        0 516 2023 cron.deny
drwxr-xr-x.  2 root root       22 218 17:11 cron.hourly    #<==按小时轮询配置的目录。
drwxr-xr-x.  2 root root        6 610 2014 cron.monthly    #<==按月轮询配置的目录。
-rw-r--r--.  1 root root      451 610 2014 crontab
drwxr-xr-x.  2 root root        6 610 2014 cron.weekly     #<==按周轮询配置的目录。

用户定时任务计划
Crond服务在工作时会以分钟为单位查看/var/spool/cron路径下以系统用户名命名的定时任务文件,确定是否有需要执行的任务计划。如果有,就会把定时任务调度到内存中执行,老男孩把这部分文件称之为用户定时任务文件,使用crontab命令编辑的文件最终都会以当前用户名作为文件名存在于/var/spool/cron路径下。

如果是系统管理员或某个普通用户定期要做的任务工作,例如每隔5分钟和互联网上时间服务器进行时间同步,每天晚上0点备份网站站点数据及数据库数据,就可以使用crontab命令配置在/var/spool/cron路径下。

1.4 cron定时任务语法

crontab -l #【查看】定时任务列表(cat /var/spool/cron/root)
crontab -e #【编辑】定时任务列表(vim  /var/spool/cron/root)
-l(字母)	 # 查看定时任务内容。提示:l为list缩写	crontab –l**
-e	      # 编辑定时任务内容,提示:e为edit缩写	crontab -e**

配置文件:/var/spool/cron/
定时任务在/var/spool/cron/以用户名字命名的文件,文件里就是定时任务的指令。
用root配置的定时任务 /var/spool/cron/root(是要备份的)
用oldboy配置的定时任务 /var/spool/cron/oldboy

/etc/cron.deny	    #该文件中所列用户不允许使用crontab命令,不常用
/etc/cron.allow	    #该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny
/var/spool/cron/	#所有用户的cron配置文件默认都存放在此目录中,文件名以用户名命名

以root用户为例,执行crontab?-e就等同于vim?/var/spool/cron/root,而执行crontab?-l就等同于执行cat?/var/spool/cron/root

1.5 定时任务书写格式

* * * * * cmd
第1段	代表分钟	00~59(00也可以是0)
第2段	代表小时	00~23
第3段	代表日,天  01~31
第4段	代表月份	01~12
第5段	代表星期,周几	0~7(0和7都代表星期日)

1.6 定时任务书写中特殊字符含义

特殊符号含义
**号,表示任意时间都,实际就是“每”的意思。
-减号,表示分隔符,表示一个时间范围,区间段
,逗号,表示分隔时段的意思。
/nn代表数字,即“每隔n单位时间”

1.7 crontab命令编辑的定时任务依赖服务

systemctl start crond
systemctl enable crond

1)在编辑定时任务文件后,【无需重启定时任务】,crond会自动检查更改的变化。
2)当定时任务不能正确执行时,请查看定时任务日志文件(【/var/log/cron】)获取故障信息。

1.8 用户定时任务Cron的使用实例。

命令实例1:*/1 * * * * /bin/sh /scripts/data.sh
命令实例2:30 3,12 * * * /bin/sh /scripts/oldboy.sh
命令实例3:30 */6 * * * /bin/sh /scripts/oldboy.sh
命令实例4:30 8-18/2 * * * /bin/sh /scripts/oldboy.sh 
命令实例5:30 21 * * * /application/apache/bin/apachectl graceful
命令实例6:45 4 1,10,22 * * /application/apache/bin/apachectl graceful
命令实例7:10 1 * * 6,0 /application/apache/bin/apachectl graceful
命令实例8:0,30 18-23 * * * /application/apache/bin/apachectl graceful
命令实例9:00 */1 * * * /application/apache/bin/apachectl graceful
命令实例10:* 23,00-07/1 * * * /application/apache/bin/apachectl graceful***
命令实例11:00 11 * 4 1-3 /application/apache/bin/apachectl graceful
命令实例12: 每周日早晨9:30 去老男孩教育上课
30 09 * * 0  #去老男孩教育上课
命令实例13:30 08 * * * 去老男孩教育上课

1.9 实践定时任务

往/data/oldboy/test.log,每分钟追加一个 “I study linux date”。
步骤:
1)命令行实验命令

[root@oldboy ~]# mkdir -p /data/oldboy/
[root@oldboy ~]# echo "I study linux `date`" >>/data/oldboy/test.log
[root@oldboy ~]# echo "I study linux `date`" >>/data/oldboy/test.log
[root@oldboy ~]# cat /data/oldboy/test.log
I study linux Sun Jun  9 12:45:14 CST 2030
I study linux Sun Jun  9 12:45:15 CST 2030

2)crontab -e

[root@oldboy ~]# crontab -l
### print char by yangyang for oldboy at 20300609
* * * * * echo "I study linux `date`" >>/data/oldboy/test.log
tail -f /data/oldboy/test.log

考试:
范例:让服务器时间每5分钟和互联网时间做一次同步。
1)去网上查时间同步时间命令

[root@oldboy ~]# yum install ntpdate -y
[root@oldboy ~]# date
Sun Jun  9 13:01:56 CST 2030
[root@oldboy ~]# ntpdate ntp5.aliyun.com
 9 Jun 10:40:29 ntpdate[1996]: step time server 203.107.6.88 offset -284005306.612663 sec
[root@oldboy ~]# date
Wed Jun  9 10:40:35 CST 2021

2)配置定时任务

### sync time by oldboy for lingdao at 20300609
*/5 * * * * ntpdate ntp5.aliyun.com >/dev/null 2>&1

工作中可以配置两个地址:
链接: https://blog.csdn.net/weixin_34355881/article/details/85024868

3)测试。

ntpdate ntp5.aliyun.com
date -s "2030/06/09"

企业面试考试题:
每天晚上00点10分,打包备份如下文件(/etc/rc.local,/var/spool/cron/root,/etc/hosts),
使用2021-06-09时间作为压缩包文件名的一部分,备份到/backup目录下。

1)命令行命令搞定

mkdir /backup -p
tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
ls /backup/

2)写定时任务

10 00 * * * /bin/tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.d/rc.local /var/spool/cron/root /etc/hosts
10 00 * * * /bin/tar zcfh /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts

上述操作是有问题。

定时任务书写要领:
1)定时任务后面执行的命令不能有百分号,如果非要有就转义 \%
不加%日志报错。

[root@oldboy scripts]# grep tar /var/log/cron
Jun  9 00:12:01 oldboy CROND[2390]: (root) CMD (/bin/tar zcf /backup/conf_$(date +)
Jun  9 00:13:01 oldboy CROND[2408]: (root) CMD (/bin/tar zcf /backup/conf_$(date +)

2)定时任务尽量用脚本(命令放到文件里)。脚本结尾加.sh
3)/bin/sh 脚本全路径
4)&>/dev/null或者>/dev/null 2>&1

生产写定时任务步骤:
1)命令行命令搞定

mkdir /backup -p
tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts
ls /backup/

2)放入文件

vim tar.sh
/bin/tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.local /var/spool/cron/root /etc/hosts

3)命令行执行脚本

/bin/sh /server/scripts/tar.sh

4)编辑定时任务

[root@oldboy scripts]# crontab -l|head -2   
#####
10 00 * * *  /bin/sh /server/scripts/tar.sh &>/dev/null

5)测试
测试过程最好【线下测试环境】

/bin/sh /server/scripts/tar.sh   

真正观察结果。调节每分钟。
就是用命令转义实现:

####################################
* * * * * /bin/tar zcf /backup/conf_$(date +\%F).tar.gz /etc/rc.d/rc.local /var/spool/cron/root /etc/hosts
          /etc/rc.d/rc.local

调试方法
/var/log/cron

[root@oldboy scripts]# ls /backup/
conf_2030-06-09.tar.gz
[root@oldboy scripts]# grep tar /var/log/cron
Jun  9 00:21:01 oldboy CROND[2549]: (root) CMD (/bin/tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.d/rc.local /var/spool/cron/root /etc/hosts)
Jun  9 00:22:01 oldboy CROND[2566]: (root) CMD (/bin/tar zcf /backup/conf_$(date +%F).tar.gz /etc/rc.d/rc.local /var/spool/cron/root /etc/hosts)

遇到问题
/var/log/cron看日志
百度下

1.10 企业面试题:

1)在每周6的凌晨3:15执行/home/shell/collect.pl,并将标准输出和标准错误输出到/dev/null设备,请写出crontab中的语句。

15 3 * * * /home/shell/collect.pl >/dev/null 2>&1
# 说明:chmod +x /home/shell/collect.pl ,还可以
15 3 * * * /bin/perl /home/shell/collect.pl >/dev/null 2>&1

2)crontab在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh,怎么实现??

00 6-12/2 * 11 * /bin/sh /usr/bin/httpd.sh &>/dev/null

3)crontab文件由六个域组成,每个域之间用空格分割,其排列正确的为(B )
A、MIN HOUR DAY MONTH YEAR COMMAND
B、MIN HOUR DAY MONTH DAYOFWEEK COMMAND
C、COMMAND HOUR DAY MONTH DAYOFWEEK
D、COMMAND YEAR MONTH DAY HOUR MIN

以下内容见图
生产环境定时任务书写要领
要领1:为定时任务规则加必要的注释
要领2:尽量以脚本形式执行
要领3:在执行的Shell脚本前加上/bin/sh
要领4:定时任务配置结尾加>/dev/null 2>&1
要领5:在指定用户下执行相关定时任务
要领6:生产任务计划程序中不要随意打印输出信息
要领7:执行的脚本要存放到规范路径下
要领8:配置定时任务要规范操作过程,减少出错
要领9:定时任务脚本中程序命令及路径尽量用全路径
要领10:时间变量%号要用反斜线转义
要领11:若脚本中调用了系统环境变量,要重新定义

调试cron定时任务的技巧总结
要领1:增加执行任务频率调试任务
要领2:调整系统时间调试任务(不能用于生产环境)
要领3:通过重定向日志输出调试定时任务
要领4:通过/var/log/cron来调试任务

在这里插入图片描述

Linux系统开源邮件服务软件:qmail,sendmail,posfix
买163,qq企业邮箱,阿里企业邮箱。

2.【常见企业故障案例:No space left on device】

因果关系:
No space left on device原因是因为inode满了,inode满了是因为定时任务配置不当,
导致/var/spool/postfix/maildrop/小文件过多。
定时任务结尾不加&>/dev/null的以后就会导致/var/spool/clientmqueue满。
/var/spool/clientmqueue sendmail 邮件系统存放临时邮件的目录 C6:
/var/spool/postfix/maildrop/ posfix 如果是CentOS6/7,则处理的路径为
大量的小文件是【邮件】,邮件哪来的?
邮件系统服务没有开启的时候,同时定时任务不加&>/dev/null,定时任务的输出、报错,定时任务程序就会给root发邮件。
导致inode满了。

[root@oldboy ~]# ls /var/spool/postfix/maildrop/|wc -l
466

防止大量小文件充满磁盘导致inode满的方法
1)尽量将cron任务里面的命令或脚本中的命令结尾加上>/dev/null 2>&1,
或在写定时执行脚本时,把输出定向到指定文件中(适合所有的情况)。
2)当然也可以开启邮件服务,不过最好不做,因为邮件服务会带来额外的安全问题。
3)加定时清理任务,比如,将find /var/spool/clientmqueue/ -type f -mtime +30|xargs rm -f
放入定时任务,每周处理一次(CentOS5适合),如果是CentOS6/7,则处理的路径为/var/spool/postfix/maildrop/。

3. 【常见企业故障案例:】

一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在cron里配置了如下内容:50 17 * * 1-5 /usr/local/bin/resin_restart.sh,发现不执行,但是手工执行/usr/local/bin/resin_restart.sh,又可以。
为什么?
解答:
定时任务执行的脚本是非登录shell,所以脚本中使用的环境变量获取不到,所以,定时任务执行了,脚本执行的不正确。
解决办法:就是在脚本中,把调用/etc/profile中的环境变量再重新定义。

重点:
1.书写专业写法。
2.两个案例。
3.图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值