作业-第04周--课堂-Day17-linux系统定时任务Cro
Day17 课堂笔记
1 Linux系统定时任务
1、什么是定时任务?
周期性的执行任务计划的软件,Linux定时任务的常用软件crond
。
2、使用定时任务软件,可以每天,每小时按你需求重复的执行一项工作。
例如:备份 都是0点以后,2点爬起来备份,4点以后睡觉。
需要写一个程序实现自动备份,然后让定时任务软件帮你执行。
3、怎样用。
(1)系统定时任务计划
- 1.不用管理员干预,系统自动执行。
- 2.也可以利用系统任务为管理员服务。
[root@oldboy ~]# ll /var/log/messages*
-rw-------. 1 root root 96594 Mar 21 12:40 /var/log/messages
-rw-------. 1 root root 485249 Mar 20 10:46 /var/log/messages-20190320
[root@oldboy ~]# ll /var/log/secure*
-rw-------. 1 root root 1430 Mar 21 12:50 /var/log/secure
-rw-------. 1 root root 2695 Mar 20 10:46 /var/log/secure-20190320
[root@oldboyedu /etc/cron.daily]# ll /etc/cron.daily/logrotate /etc/logrotate.conf
-rwx------. 1 root root 219 Oct 31 2018 /etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf
按天切割日志,就可以用logrotate
。
(2)用户定时任务计划
在Linux系统中,
cron
是定时任务的软件名,
crond
是服务进程名,真正实现定时任务服务。
crontab
命令是用来设置定时任务规则的配置命令。
要想配置定时任务,首先启动crond
服务。
systemctl start crond.service
systemctl stop crond.service
systemctl status crond.service
开启自启动和不启动:
systemctl enable crond.service
systemctl disable crond.service
[root@oldboyedu ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-10-08 01:56:12 CST; 2min 26s ago
Main PID: 13189 (crond)
CGroup: /system.slice/crond.service
└─13189 /usr/sbin/crond -n
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (RANDOM_DELAY will be...)
Oct 08 01:56:12 oldboyedu systemd[1]: Started Command Scheduler.
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (running with inotify...)
Oct 08 01:56:12 oldboyedu crond[13189]: (CRON) INFO (@reboot jobs will be...)
Hint: Some lines were ellipsized, use -l to show in full.
crontab
命令是用来设置定时任务规则的配置命令。
内容存放哪里了。定时任务内容存放的位置/var/spool/cron/
以当前用户名作为文件名
[root@oldboyedu ~]# ll /var/spool/cron/
total 8
-rw------- 1 oldboy oldboy 10 Oct 8 02:04 oldboy
-rw------- 1 root root 6 Oct 8 02:02 root
[root@oldboyedu ~]# cat /var/spool/cron/oldboy
###oldboy
crontab
参数:
- -l 列表 查看已经设置的定时任务*
- -e edit 编辑定时任务*
- -u user 查看特定用户下定时任务
举例root
:
crontab -l == cat /var/spool/cron/root
crontab -e == vim /var/spool/cron/root
编写定时任务的语法:
# 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
# | | | | |
# * * * * * (command to be executed)
共六列:
第一列:分 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
第六列:要执行的任务命令或程序
特殊符号:
* 表示的 每或每一 的意思
00 23 * * * cmd
- 连续区间 1-10
00 8-23 * * * cmd
, 列举 1,2,3,4,8
00 1,2,3,4,8 * * * cmd
/n n是数字。
n代表自然数字,即“每隔n单位时间”,例如:每10分钟执行一次任务可以写成
*/10 * * * * cmd
*/1 * * * * /bin/sh /scripts/data.sh
30 3,12 * * * /bin/sh /scripts/oldboy.sh
30 */6 * * * /bin/sh /scripts/oldboy.sh
30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
30 21 * * * 最强大脑
45 4 1,10,22 * * /application/apache/bin/apachectl graceful
10 1 * * 6,0 /application/apache/bin/apachectl graceful
0,30 18-23 * * * /application/apache/bin/apachectl graceful
00 */1 * * * /application/apache/bin/apachectl graceful
2 命令实例
命令实例1:
*/1 * * * * /bin/sh /scripts/data.sh
在本例中除了数字与命令脚本外,还使用到了符号"",号的意思“每一”。
第一列的意思为分钟,特殊符号“/”表示每隔的意思,即表示每隔一分钟执行/bin/sh /scripts/data.sh
程序。
命令实例2:
30 3,12 * * * /bin/sh /scripts/oldboy.sh
在本例中,第一列为30,表示30分钟;第二列为 3,12,这代表3点及 12点,此定时任务的意思是每天凌晨3点和中午12点的半点时刻(或描述为每天凌晨3:30和中午12:30)执行/scripts/oldboy.sh
脚本。
命令实例3:
30 */6 * * * /bin/sh /scripts/oldboy.sh
在本例中,第一列为30,表示30分钟;第二列*/6代表每6个小时,也相当于 6、12、18、24 的作用。此定时任务的意思是每隔6个小时的半点时刻执行/scripts/oldboy.sh
脚本任务。
命令实例4:
30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
在本例中,其中的第一列为30,表示30分钟;第二列8-18/2代表在早晨8点到下午18点之间每隔2小时,也相当于把8、10、12、14、16、18单独列出。
那么,此定时任务的意思就是早晨8点到下午18点之间,每隔2小时的半点时刻执行/scripts/oldboy.sh
脚本任务。
命令实例5:
30 21 * * * /application/apache/bin/apachectl graceful
本例表示每晚的21:30重启apache
。
命令实例6:
45 4 1,10,22 * * /application/apache/bin/apachectl graceful
本例表示每月1、10、22日的凌晨4 : 45分重启apache
。
命令实例7:
10 1 * * 6,0 /application/apache/bin/apachectl graceful
本例表示每周六、周日的凌晨1 : 10分重启apache
。
命令实例8:
0,30 18-23 * * * /application/apache/bin/apachectl graceful
本例表示在每天18 : 00至23 : 00之间每隔30分钟重启apache
。
命令实例9:
00 */1 * * * /application/apache/bin/apachectl graceful
本例表示每隔一小时整点重启apache
命令实例10:
* 23,00-07/1 * * * /application/apache/bin/apachectl graceful
本例并不表示晚上23点和早上0-7点之间每隔一小时重启apache
。
要说明的是,以上结果是不规范的,也是不对的。大家想想为什么?
以上定时任务的第一列为*,表示每分都执行任务即晚上23点和早上0-7点之间每隔一小时的每分都重启apache
,很可怕吧。
命令实例11:
00 11 * 4 1-3 /application/apache/bin/apachectl graceful
本例表示4月的每周一到周三的上午11点整重启apache
。
命令实例12:
30 09 * * 0 去老男孩教育上课
本例表示每周日上午9:30去老男孩教育上课,这是周末班的上课频率。
命令实例13:
30 08 * * *去老男孩教育上课
本例表示每上午8:30去老男孩教育上课,这是脱产班的上课频率。
3 实践:
范例1:每分钟追加一次oldboy
字符串到/tmp/oldboy.log
里。
解答:大象放冰箱分三步
a.命令行执行成功。
[root@oldboyedu ~]# echo "oldboy">>/tmp/oldboy.log
[root@oldboyedu ~]# cat /tmp/oldboy.log
oldboy
[root@oldboyedu ~]# echo "oldboy">>/tmp/oldboy.log
[root@oldboyedu ~]# cat /tmp/oldboy.log
oldboy
oldboy
b.配置定时任务crontab -e
编辑配置
[root@oldboyedu ~]# crontab -l
#####
* * * * * echo "oldboy">>/tmp/oldboy.log
c.检查
[root@oldboyedu ~]# tail -f /tmp/oldboy.log
oldboy
oldboy
oldboy
老男孩思想:
1)先输入* * * * *
2)先命令行操作成功。
3)拷贝命令到定时任务编辑里。
范例2:让服务器时间每5分钟和互联网时间做一次同步。
安装时间服务软件:
yum install ntpdate -y
更新互联网时间 :
/usr/sbin/ntpdate ntp1.aliyun.com
/dev/null 黑洞设备
&>/dev/null 等价>/dev/null 2>&1
[root@oldboyedu ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
范例3:每天晚上0点,把站点目录/var/www/html
下的内容打包备份到/data
目录下,并且要求每次生成不同的备份包名。
至少分三步:
- 命令行稿成功
准备工作:
[root@oldboyedu ~]# mkdir /var/www/html /data -p
具体命令:
[root@oldboyedu ~]# tar zcvf /data/html_$(date +%F).tar.gz /var/www/html/
tar: Removing leading `/' from member names
/var/www/html/
[root@oldboyedu ~]# ll /data
total 4
-rw-r--r-- 1 root root 117 Mar 22 11:59 html_2019-03-22.tar.gz
- 编写定时任务
[root@oldboyedu ~]# crontab -l
00 00 * * * tar zcvf /data/html_$(date +%F).tar.gz /var/www/html/
错了,不执行。。。。
看报错日志。。。错误日志
定时任务没有执行,出错了日志在哪里?
出错日志/var/log/cron
Mar 22 12:03:01 oldboyedu CROND[18770]: (root) CMD (tar zcvf /data/html_$(date +)
定时任务对%
的要求,百分号要转义\%
正确答案:
[root@oldboyedu ~]# crontab -l
00 00 * * * tar zcvf /data/html_$(date +\%F).tar.gz /var/www/html/
优秀的答案(企业里):
- 命令行执行
cd /var/www
tar zcf /data/html_$(date +%F).tar.gz ./html
- 尽量用脚本文件实现
mkdir /server/scripts -p #存放脚本的文件
运维规范:
脚本位置:/server/scripts
软件位置:/server/tools
编译位置:/application/
软件名字-版本,然后要软链接。
cd /server/scripts
#cat bak.sh
cd /var/www
tar zcf /data/html_$(date +%F).tar.gz ./html
命令行执行:
/bin/sh /server/scripts/bak.sh
- 编辑定时任务
#bak html dir by oldboy at 2020108
00 00 * * * /bin/sh /server/scripts/bak.sh &>/dev/null
[root@oldboyedu /server/scripts]# crontab -l|tail -2
#bak html dir by oldboy at 2020108
00 00 * * * /bin/sh /server/scripts/bak.sh &>/dev/null
- 检查正式结果
[root@oldboyedu /server/scripts]# ls -l /data
4 生产环境下的定时Cron书写要领
要领01:为定时任务规则加必要的注释
要领02:所有的定时任务尽量都以脚本的形式执行
要领03:在执行的Shell
脚本前加上/bin/sh
要领04:定时任务中命令或脚本的结尾加>/dev/null 2>&1
要领05:在指定用户下执行相关定时任务
要领06:生产任务计划程序中不要随意打印输出信息,有输出的想法去掉。
要领07:定时任务执行的脚本要存放到规范路径下
要领08:配置定时任务要规范操作过程,减少出错
要领09:定时任务脚本中程序命令及路径尽量用全路径
要领10:时间变量%号要用反斜线转义(只有定时任务里是命令时需要)
要领11:若脚本中调用了系统环境变量,要重新定义
要领12:出错或无法执行,就检查/var/log/cron
日志