第二十七章 Linux系统管理之定时任务
一、定时任务概述
1.含义:设定某个日期或时间周期性执行指令。
2.crond # 守护进程 分钟级别
rond是Linux系统中用来定期执行命令或脚本的一种服务软件,一般情况下,我们安装完CentOS操作系统之后,
默认便会启动Crond任务调度服务。
Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定
时任务规则自动执行该定时任务工作,这个Crond定时任务服务就相当于我们平时早起使用的闹钟一样。
3.使用情况:
两种:
系统级别定时任务: 定时清理文件 收集系统信息 定时切割日志
用户级别定时任务: 同步时间 定时备份数据
二、定时任务相关介绍
[root@jindada ~]# ll /etc/cron* -d
drwxr-xr-x. 2 root root 21 Jul 29 08:56 /etc/cron.d #定时任务的统一存放目录
drwxr-xr-x. 2 root root 57 Jul 29 08:56 /etc/cron.daily #系统每天执行的定时任务
-rw------- 1 root root 0 Apr 11 2018 /etc/cron.deny #定时任务的黑名单
drwxr-xr-x. 2 root root 22 Jul 29 08:56 /etc/cron.hourly #系统每小时执行的定时任务
drwxr-xr-x. 2 root root 6 Jun 10 2014 /etc/cron.monthly #系统每月执行的定时任务
-rw-r--r-- 1 root root 451 Jun 10 2014 /etc/crontab #定时任务主配置文件
drwxr-xr-x. 2 root root 6 Jun 10 2014 /etc/cron.weekly #系统每周执行的定时任务
[root@jindada ~]# cat /etc/crontab
SHELL=/bin/bash #定时任务所使用的命令解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin #定时任务所能用到的命令路径
MAILTO=root #接收邮件
# 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
分时日月周 用户 命令
#跟定时任务相关的文件
[root@jindada ~]# ll /var/spool/cron/root #存放定时任务的配置文件
total 0
[root@jindada ~]# ll /var/log/cron #定时任务执行的过程 日志
[root@jindada ~]# ll /var/spool/mail/ #用户的邮件
怎样书写定时任务
crontab #书写定时任务的命令
选项:
-e #编辑定时任务 === vi /var/spool/cron/root
-l #查看定时任务 === cat /var/spool/cron/root
1. 语法检查
2. 方便简单
#定时任务的规则
* # 每(分时日月周)都执行
*/5 # 每 5 (分时日月周)执行 每隔多长时间
/5
1-3 #时间范围 1-3 连续的时间 1点到3点
1,3 #不连续的时间 1点和3点
00 02 * * * #每天的凌晨2点整
00 02 1 * * #每个月的1号凌晨2点整
00 02 14 2 * #每年的2月14日凌晨2点整
00 02 * * 7 #每周日的凌晨2点整
00 02 * 6 5 #每年的6月份的每周五的凌晨2点整
00 02 14 * 7 #每个月的14号或者周日的凌晨2点整
00 02 14 2 7 #每年的2月份的14号或者周日的凌晨2点整
*/10 02 * * * #每天的凌晨2点每隔10分钟
* * * * * #每分钟
00 00 14 2 * #每年的2月份14号的凌晨0点整
*/5 * * * * #每隔5分钟
00 02 * 1,5,8 * #每年的1和5和8月的每天的凌晨2点整
00 02 1-8 * * #每个月的1到8号的凌晨2点整
00 21 * * * #每天晚上21点整
45 4 1,10,22 * * #每个月的1,10,22号 的凌晨4点45分
45 4 1-10 * * #每个月的1到10号的凌晨4点45分
3,15 8-11 */2 * * #每个月每隔两天的8到11点的3分和15分的时候
0 23-7/2 * * * #每天的23点到7点的每隔2个小时的整点
15 21 * * 1-5 #每周一到周五的晚上21点15分
三、定时任务与案例
1. 定时同步系统时间 每分钟同步
[root@jindada ~]# ntpdate ntp.aliyun.com
31 Jul 10:27:12 ntpdate[13673]: step time server 203.107.6.88 offset -28797.933639 sec
[root@jindada ~]# date
Fri Jul 31 10:27:18 CST 2020
定时任务最好加上注释 作者 时间
[root@jindada ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * ntpdate ntp.aliyun.com
#修改时间
[root@jindada ~]# date -s 20200730
Thu Jul 30 00:00:00 CST 2020
[root@jindada ~]# date
Thu Jul 30 00:00:02 CST 2020
#查看定时任务的执行过程
[root@jindada ~]# tailf /var/log/cron
Jul 31 17:01:01 jindada run-parts(/etc/cron.hourly)[13622]: finished 0anacron
Jul 31 17:52:01 jindada crontab[13651]: (root) LIST (root)
Jul 31 18:01:01 jindada CROND[13656]: (root) CMD (run-parts /etc/cron.hourly)
Jul 31 18:01:01 jindada run-parts(/etc/cron.hourly)[13656]: starting 0anacron
Jul 31 18:01:01 jindada run-parts(/etc/cron.hourly)[13665]: finished 0anacron
Jul 31 10:27:49 jindada crontab[13675]: (root) BEGIN EDIT (root)
Jul 31 10:30:30 jindada crontab[13675]: (root) REPLACE (root)
Jul 31 10:30:30 jindada crontab[13675]: (root) END EDIT (root)
Jul 31 10:30:36 jindada crontab[13677]: (root) LIST (root)
Jul 30 00:00:03 jindada CROND[13682]: (root) CMD (ntpdate ntp.aliyun.com)
#查看接收的邮件发现了报错 说命令找不到
[root@jindada ~]# ll /var/spool/mail/root
-rw------- 1 root mail 3541 Jul 30 00:01 /var/spool/mail/root
[root@jindada ~]# tailf /var/spool/mail/root
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
X-Cron-Env: <USER=root>
Message-Id: <20200729160201.064E8802C9EE@jindada.localdomain>
Date: Thu, 30 Jul 2020 00:02:01 +0800 (CST)
/bin/sh: ntpdate: command not found
#重新编写定时任务
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com
[root@jindada ~]# tailf /var/log/cron
Jul 30 00:01:01 jindada run-parts(/etc/cron.hourly)[13694]: starting 0anacron
Jul 30 00:01:02 jindada anacron[13707]: Anacron started on 2020-07-30
Jul 30 00:01:02 jindada anacron[13707]: Normal exit (0 jobs run)
Jul 30 00:01:02 jindada run-parts(/etc/cron.hourly)[13709]: finished 0anacron
Jul 30 00:02:01 jindada CROND[13714]: (root) CMD (ntpdate ntp.aliyun.com)
Jul 30 00:03:01 jindada CROND[13722]: (root) CMD (ntpdate ntp.aliyun.com)
Jul 30 00:03:31 jindada crontab[13728]: (root) BEGIN EDIT (root)
Jul 30 00:03:38 jindada crontab[13728]: (root) REPLACE (root)
Jul 30 00:03:38 jindada crontab[13728]: (root) END EDIT (root)
Jul 30 00:03:43 jindada crontab[13730]: (root) LIST (root)
Jul 30 00:04:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
Jul 30 00:04:01 jindada CROND[13734]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com)
Jul 31 10:35:04 jindada CROND[13741]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com)
#邮件正在一直接收信息 导致邮件过大
[root@jindada ~]# ll /var/spool/mail/root
-rw------- 1 root mail 7028 Jul 31 10:35 /var/spool/mail/root
[root@jindada ~]# ll /var/spool/mail/root
-rw------- 1 root mail 7929 Jul 31 10:36 /var/spool/mail/root
#停掉邮件服务 日志不在发生变化
[root@jindada ~]# systemctl stop postfix
[root@jindada ~]# ll /var/spool/mail/root
-rw------- 1 root mail 8829 Jul 31 10:37 /var/spool/mail/root
#但是会一直生成小文件
[root@jindada ~]# ll /var/spool/postfix/maildrop/
total 12
-rwxr--r-- 1 root postdrop 601 Jul 31 10:38 7FF40C0CD48D
-rwxr--r-- 1 root postdrop 600 Jul 31 10:39 A8919C0CD48E
-rwxr--r-- 1 root postdrop 601 Jul 31 10:40 CD943C0CD48F
#重新编写定时任务
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
[root@jindada ~]# systemctl start postfix
[root@jindada ~]# ll /var/spool/mail/root
-rw------- 1 root mail 13469 Jul 31 10:43 /var/spool/mail/root
2. 把系统的时间追加到一个文件中
[root@jindada ~]# date +%F_%T >> /root/time.txt
[root@jindada ~]# cat /root/time.txt
2020-07-31_10:51:45
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
#xxxxxxxxxx
* * * * * /usr/bin/date +%F_%T >> /root/time.txt
[root@jindada ~]# tailf /var/log/cron
Jul 31 10:54:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
Jul 31 10:54:01 jindada CROND[14046]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null)
Jul 31 10:54:01 jindada CROND[14047]: (root) CMD (/usr/bin/date +)
#修改定时任务
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
#xxxxxxxxxx
* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
[root@jindada ~]# tailf /var/log/cron
Jul 31 10:56:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
Jul 31 10:56:01 jindada CROND[14074]: (root) CMD (/usr/bin/date +%F_%T >> /root/time.txt )
[root@jindada ~]# cat time.txt
2020-07-31_10:56:01
总结:
定时任务中,有些特殊字符不识别,需要转义
3. 备份/etc/目录 压缩包名带有时间戳 保留最近的3天数据
[root@jindada ~]# cat backup.sh
#!/bin/bash
#重新定义环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
#1.创建备份目录
mkdir -p /backup
#2.开始备份
cd /
tar czf /backup/etc_$(date +%F_%M).tar.gz etc/
#3.删除3天以前的数据
find /backup -type f -mtime +3 -name "*.tar.gz" -delete
[root@jindada ~]# sh backup.sh
[root@jindada ~]# ll /backup/
total 9972
-rw-r--r-- 1 root root 10210944 Jul 31 11:05 etc_2020-07-31_05.tar.gz
#批量执行
[root@jindada ~]# for i in {20..31};do date -s 2020/07/$i && sh /root/backup.sh ;done
#编写定时任务
[root@jindada ~]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
#xxxxxxxxxx
* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
#备份
* * * * * /bin/bash /root/backup.sh &>/dev/null
[root@jindada ~]# tailf /var/log/cron
Jul 31 11:10:01 jindada crond[6003]: (root) RELOAD (/var/spool/cron/root)
Jul 31 11:10:01 jindada CROND[14327]: (root) CMD (/usr/bin/date +%F_%T >> /root/time.txt )
Jul 31 11:10:01 jindada CROND[14328]: (root) CMD (/bin/bash /root/backup.sh &>/dev/null)
Jul 31 11:10:01 jindada CROND[14329]: (root) CMD (/usr/sbin/ntpdate ntp.aliyun.com &>/dev/null)
[root@jindada ~]# ll /backup/
total 59832
-rw-r--r-- 1 root root 10210944 Jul 28 00:00 etc_2020-07-28_00.tar.gz
-rw-r--r-- 1 root root 10210944 Jul 29 00:00 etc_2020-07-29_00.tar.gz
-rw-r--r-- 1 root root 10210944 Jul 30 00:00 etc_2020-07-30_00.tar.gz
-rw-r--r-- 1 root root 10210944 Jul 31 00:00 etc_2020-07-31_00.tar.gz
-rw-r--r-- 1 root root 10210944 Jul 31 11:05 etc_2020-07-31_05.tar.gz
-rw-r--r-- 1 root root 10210944 Jul 31 11:10 etc_2020-07-31_10.tar.gz
四、定时发邮件
[root@jindada ~]# yum install -y mailx
[root@jindada ~]# vim /etc/mail.rc
#发件人
set from=xxx@qq.com
#邮件服务器
set smtp=smtp.qq.com
#发件人用户名
set smtp-auth-user=xxx@qq.com
#发件人密码(QQ邮箱不可以使用密码,只能使用授权码)
set smtp-auth-password=xxx
#登录方式
set smtp-auth=login
#邮件服务器协议及端口
set smtp=smtps://smtp.qq.com:465
#忽略证书
set ssl-verify=ignore
#指定证书位置
set nss-config-dir=/etc/pki/nssdb/
#或者指定别的证书位置,创建证书目录
#放到最后
set from=xxx@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=xxx@qq.com
set smtp-auth-password=xxx #客户端的授权码
set smtp-auth=login
set smtp=smtps://smtp.qq.com:465
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
[root@jindada ~]# echo "test" | mail -s "hello" xxxx@qq.com
[root@jindada ~]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the. #忽略这个错误
[root@jindada ~]# mkdir qingshu
[root@jindada ~]# cd qingshu
[root@jindada qingshu]# vim qingshu1.txt
[root@jindada qingshu]# mail -s "致亲爱的小姐姐" xxx@qq.com < qingshu1.txt
[root@jindada qingshu]# Error in certificate: Peer's certificate issuer has been marked as not trusted by the.
#编写自动化脚本
[root@jindada qingshu]# cat /root/send_mail.sh
#!/bin/bash
Qingshu=$(ls -1 /root/qingshu/ |head -1)
mail -s "致亲爱的小姐姐" xxxx@qq.com < /root/qingshu/$Qingshu
mail -s "致亲爱的小姐姐" xxxx@qq.com < /root/qingshu/$Qingshu
if [ $? -eq 0 ];then
rm -f /root/qingshu/$Qingshu
fi
[root@jindada qingshu]# ll
total 20
-rw-r--r-- 1 root root 85 Jul 31 11:49 qingshu1.txt
-rw-r--r-- 1 root root 184 Jul 31 11:51 qingshu2.txt
-rw-r--r-- 1 root root 121 Jul 31 11:51 qingshu3.txt
-rw-r--r-- 1 root root 155 Jul 31 11:51 qingshu4.txt
-rw-r--r-- 1 root root 70 Jul 31 11:52 qingshu5.txt
#编写定时任务
[root@jindada qingshu]# crontab -l
#同步系统时间 jindada 20200731_10
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
#xxxxxxxxxx
#* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
#备份
#* * * * * /bin/bash /root/backup.sh &>/dev/null
#xxxxxxxxx
* * * * * /bin/bash /root/send_mail.sh &>/dev/null
五、定时任务总结
思路:
1.手动执行命令,然后保留执行成功的结果。
2.编写脚本
脚本需要统一路径/scripts
脚本内容复制执行成功的命令(减少每个环节出错几率)
3.执行脚本
使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash /bin/bash)
执行脚本成功后,复制该执行的命令,以便写入cron
4.编写定时任务
加上必要的注释信息, 人、时间、任务
设定定时任务执行的周期
粘贴执行脚本的命令(不要手敲)
5.调试定时任务
增加任务频率测试
检查环境变量问题(最好在脚本中重新定义环境变量PATH)
检查crond服务日志
总结:
1.定时任务规则之前加注释
2.使用脚本执行定时任务(只有一条简单命令的可以直接使用命令执行)
3.运行脚本一定要用绝对路径执行,统一脚本位置。
4.定时任务中date命令的百分号需转义才能使用。
5.命令或脚本结果(正确及错误)定向到空(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
6.避免不必要的程序及命令输出,如打包命令,tar -v的显示过程的选项。
7.打包压缩使用相对路径(切到目标目录的上一级打包目标)
8.定时任务脚本中的程序文件 ,尽量用绝对路径,用户的定时任务中的文件默认存放在当前用户的家目录
9.系统与命令位置有关的环境变量问题,建议脚本中重新定义环境变量PATH。
第二十七章 Linux系统管理之定时任务的更多相关文章
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
- Gradle 1.12用户指南翻译——第二十七章. Ear 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第二十七章:流程控制语句中循环语句for
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第12章 Linux系统管理
1. 进程管理 1.1 进程查看 (1)进程简介 进程是正在执行的一个程序或命令(如ls命令也是一个进程),每个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源. (2)进程管理的作用 ...
- Linux 笔记 - 第十七章 Linux LVM 逻辑卷管理器
一.前言 在实际生产中,有时会遇到磁盘分区空间不足的情况,这时候就需要对磁盘进行扩容,普通情况下需要新加一块磁盘,重分区.格式化.数据复制.卸载旧分区.挂载新分区等繁琐的步骤,而且有可能造成数据的丢失 ...
- python3 第二十七章 - 内置函数之str相关
Python 的字符串常用内建函数如下: 序号 方法及描述 实例 1 capitalize()将字符串的第一个字符转换为大写 2 center(width, fillchar) 返回一个指定的宽度 ...
- 【WPF学习】第二十七章 Application类的任务
上一章介绍了有关WPF应用程序中使用Application对象的方式,接下来看一下如何使用Application对象来处理一些更普通的情况,接下俩介绍如何初始化界面.如何处理命名行参数.如何处理支付窗 ...
- 我的学习之路_第二十七章_jQuery
jQueryjs类库 把常用对象或者方法封装起来,让我们写代码效率更高 1.jQuery 2.extjs [jQuery入门] jQuery的引入: 通过script标签的src属性引入 入门: 获取 ...
随机推荐
- 吴恩达《深度学习》-课后测验-第一门课 (Neural Networks and Deep Learning)-Week 2 - Neural Network Basics(第二周测验 - 神经网络基础)
Week 2 Quiz - Neural Network Basics(第二周测验 - 神经网络基础) 1. What does a neuron compute?(神经元节点计算什么?) [ ] A ...
- redhat中的RHCS双机配置
1. 主机概述 主机名 主机IP 备注 node1 192.168.1.101 模拟fence设备 node2 192.168.1.102 rhcs双机节点 node3 192.168.1.103 r ...
- vue | 基于vue的城市选择器和搜索城市对应的小区
城市选择器应该是比较常用的一个组件,用户可以去选择自己的城市,选择城市后返回,又根据自己选择的城市搜索小区. 功能展示 这是选择结果 这是选择城市 这是搜索小区 这是搜索小区接口,key为城市名字,i ...
- Java基本数据类型、关键字
Java基本数据类型.关键字 一.Java基本数据类型 Java有8中基本数据类型:byte\char \short \int\float\double\long\boolean 在说明每种类型大小前 ...
- redis部署问题
在部署redis哨兵的时候,一开始一直都是失败:杀死master进程后,没有选出新的master 日志如下 9985:X 18 Feb 20:14:42.409 # +sdown master mym ...
- spring boot 源码之SpringApplication
run方法 run方法主要创建和初始化ConfigurableApplicationContext,在各个节点调用SpringApplicationRunListener的回调函数,在发送异常时调用用 ...
- 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统三 | 控制反转搭配简单业务
教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 06 | 最终篇-通过AOP自动连接数据库-完成日志业 ...
- Java Web学习(八)RESTful设计
一.RESTful设计风格 REST :指的是一组架构约束条件和原则. RESTful :满足这些约束条件和原则的应用程序或设计就是 . REST 原则 客户端和服务器之间的交互在请求之间是无状态的. ...
- Java Comparable 和 Comparator 接口详解
本文基于 JDK8 分析 Comparable Comparable 接口位于 java.lang 包下,Comparable 接口下有一个 compareTo 方法,称为自然比较方法.一个类只要实现 ...
- 使用TiDB把自己写分库分表方案推翻了
背景 在日益数据量增长的情况下,影响数据库的读写性能,我们一般会有分库分表的方案和使用newSql方案,newSql如TIDB.那么为什么需要使用TiDB呢?有什么情况下才用TiDB呢?解决传统分库分 ...