定时任务
定时任务
[TOC]
01.定时任务
概述

什么是定时任务?
-
定时起床 闹钟 6点
-
时间同步、间隔15分钟同步一次
-
打包压缩(业务低谷期)
- 定时定点的执行一些流程,或者是一些任务.或者是备份.
部署

它的服务名叫‘crond’但是它的软件名为**‘cronie’**

systemctl status crond

目录结构


- 我们后面再详细介绍这两个区别,下面这些都用的用户定时任务**.**
命令

/var/spool/cron/用户名

- 当我们crontab -e修改完,**不用重启服务,因为它会自动更新


crontab -r (删除)
把当前用户的定时任务和配置文件删除

格式
两部分,什么时间,做什么!

- 这个*之间得有空格.

-
案例.每月1号凌晨4点执行
- 00 04 01 * * -
案例.每小时的第15分钟执行命令
- 15 * * * *
特殊符号

- 注意第二个隔天的

-
案例.每天上午2点到12点间隔2个小时执行命令
- 00 2-12/2 * * * -
案例.每间隔2小时执行一次命令
- 00 */2 * * *
具体什么时间执行:
*/1 * * * *
-
比如当前12.01,定时任务执行时间是12.02
- 从下一个分钟开始运行
*/5 * * * *
-
每隔5分钟 当前12.02
-
下次任务执行的时间是12.05
-
从整点计算,也就是12:00开始每隔5分钟
-
常见故障
command not found
-
通常出现在用户定时任务上
- 也就是我们crontab -e

-
原因是用户定时任务中PATH变量路径只有/usr/bin:/bin,
- 而这些命令是在/usr/sbin下所以提示command not found
案例复现


- 命令行上随便运行.

-
把命令输出的内容放到文件里面.
- **最优解**

可是明明我们在命令行中,脚本可以运行,但是放在定时任务中,却运行不了???
因为我们用户定时任务只能识别/bin或者/usr/bin中的命令.
验证

解决方案
#重新定义export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/root/bin
#重新加载source /etc/profile
- 它这里是直接放在脚本里面的,并不推荐.有点冗余!
可以直接放我们用户定时任务的配置文件里面的.
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin”

-
把这个加进去就可以了
- **最简便的方法**
/var/spool/mail/root
查看自己的邮件
systemctl status postfix
邮箱服务默认开启

#centos系统邮件
- 系统如果开启了邮件服务、会自动将每条定时任务的执行命令的结果发送到邮件中
⭐命令结果处理

-
写定时任务的时候,把运行的结果 &> /dev/null
- **定时任务没有输出结果,你的邮箱自然就收不到信息**.


-
把命令输出的内容放到文件里面.
- **最优解**
关闭邮箱服务
sytemctl stop postfix
-
邮件服务对于服务器开销很大,它占用服务器资源.
-
所以企业优化掉邮件服务,关闭sytemctl stop postfix
-
如果关闭了邮箱服务,且定时任务里面有输出结果.
-
则系统会每执行一次定时任务,就把输出结果放到一个小文件里.
-
一个小文件对应一次定时任务的结果
-
可能产生大量的小文件消耗inode号
-
目录:/var/spool/postfix/maildrop/
-
-

系统VS用户
在LInux系统中设置定时任务的方式有两种
-
系统定时任务
-
用户定时任务

- 系统配置
直接编辑文件即可 vim /etc/crontab
文件位置: /etc/crontab**
[root@oldboyedu ~]#cat /etc/crontab
SHELL=/bin/bash # 指定解释器
PATH=/sbin:/bin:/usr/sbin:/usr/bin # PATH路径
MAILTO=root # 邮件发送给root
linux系统默认有个邮件服务、开启状态下执行命令的结果会给对应的用户.
- 可以重定向到空 &>/dev/null
For details see man 4 crontabs
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12)
| | | | .---- day of week (0 - 6) (Sunday=0 or 7)
| | | | |
-
-
-
-
- root 可执行命令
-
-
-

👑案例.
每隔15分钟执行命令
-
**首先在命令行测试,保证命令可以正常执行
-
如果正常执行再写入定时任务、先设置每分钟执行1次测试**
-
没有问题修改为15分钟一次.
测试----
[root@oldboyedu ~]#date -s 20071010
Wed Oct 10 00:00:00 CST 2007
修改一个错误的时间20071010
[root@oldboyedu ~]#date
Wed Oct 10 00:00:00 CST 2007
[root@oldboyedu ~]#ntpdate ntp1.aliyun.com
14 Nov 09:23:51 ntpdate[2105]: step time server 118.31.40.99 offset +571137819.063519 sec
[root@oldboyedu ~]#date
Fri Nov 14 09:23:52 CST 2025
成功同步回来
写入定时任务测试(虚拟机、测试服务器测试)
[root@oldboyedu ~]#date -s 20071010
Wed Oct 10 00:00:00 CST 2007
[root@oldboyedu ~]#cat /etc/crontab
-
-
-
-
- root ntpdate ntp1.aliyun.com
-
-
-
没有任何问题修改为每间隔15分钟同步一次.
*/15 * * * * root ntpdate ntp1.aliyun.com
- 用户配置
**使用crontab -e **
生成定时任务配置文件: /var/spool/cron/root
- 或者vim /var/spool/cron/root
**推荐使用crontab -e 自带语法检查功能
*用户定时任务和系统定时任务区别:*配置文件不同系统: /etc/crontab用户: /var/spool/cron/root编辑方式不同系统: vim /etc/crontab用户: crontab -e查看方式不同系统: cat /etc/crontab用户: crontab -l定时任务格式中系统: * * * * * root 命令用户: * * * * * 命令PATH变量的区别系统: PATH=/sbin:/bin:/usr/sbin:/usr/bin用户: PATH=/usr/bin:/bin🧣**%转义.**
①先在命令行中测试
[root@oldboy ~]#date +“%F_%H:%M”
2025-12-27_11:05
[root@oldboy ~]#date +“%F_%H:%M” >> /home/date.txt
[root@oldboy ~]#cat /home/date.txt
2025-12-27_11:06
完全可以显示出来
②放在用户定时任务里面
[root@oldboy ~]#crontab -l
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin”
*/1 * * * * date +“%F_%H:%M” >> /home/date.txt
[root@oldboy ~]#date
Sat Dec 27 11:10:21 CST 2025
现在的时间是11:10分
[root@oldboy ~]#cat /home/date.txt
2025-12-27_11:06
可以这个文件中却还是显示11:06分
- 查看日志
[root@oldboy ~]#tail -4 /var/log/cron
Dec 27 11:11:01 oldboy CROND[1509]: (root) CMD (date +”)
Dec 27 11:11:01 oldboy CROND[1504]: (root) CMDEND (date +”)
Dec 27 11:12:01 oldboy CROND[1524]: (root) CMD (date +”)
Dec 27 11:12:01 oldboy CROND[1519]: (root) CMDEND (date +”)
压根没有执行
- 因为定时任务配置文件中不识别%
解决方法
①可以使用转义%
*/1 * * * * date +“%F_%H:%M” >> /home/date.txt
[root@oldboy ~]#date
Sat Dec 27 11:16:25 CST 2025
11:16分
[root@oldboy ~]#cat /home/date.txt
2025-12-27_11:06
2025-12-27_11:16
成功传进来了11:16分
②把带%的命令放在脚本里,定时任务执行脚本
02.脚本与变量

创建变量


- shell脚本中,等号两边不能加空格.

符号
echo ${变量名}
花括号
引用变量
在命令行中用的是花括号,而不是小括号()
当然也可以不用任何的括号,直接跟变量也是可以的,echo $变量

echo $(具体命令)
小括号


反引号“

从这里可以看出来这里反引号和**$(具体的命令)小括号**如出一撤

脚本里面利用变量.用变量取替换一些东西.
⭐日志切割
服务会一直向文件中输入大量的内容、防止文件过大
- 使用定时任务+日志切割
-
间隔1天切割一次
-
这里我们测试实验,间隔1分钟一次
-
切割后的文件按照时间精确到分钟命名
-
清空原文件继续接收新的日志
-
本质就是把原文件mv改名,程序继续写入到改名前的日志文件里面.
①编写切割脚本
脚本在/server/scripts/目录下
[root@oldboyedu scripts]#cat cut.sh
cut.sh切割脚本
1.将原文件移动成时间命名文件
mv /opt/nginx.log /opt/date +%F-%H-%M_nginx.log
2.将程序进行重新加载
#systemctl reload nginx
②把执行脚本的命令写入到定时任务中
00 00 * * * sh /server/scripts/cut.sh
每天凌晨执行一次脚本
③查看日志目录结果
[root@oldboyedu scripts]#ll /opt/
total 12
-rw-r—r— 1 root root 565 Nov 14 11:39 2025-11-14-11-39_nginx.log
-rw-r—r— 1 root root 945 Nov 14 11:43 2025-11-14-11-43_nginx.log
-rw-r—r— 1 root root 10 Nov 14 11:43 nginx.log
成功被切割
03.综合任务
取系统各项指标
主机名和IP直接PASS掉
练了太多了!!!
①系统负载
我们来看系统负载:两条命令


②内存使用率


- 同时也可以把available可利用的空间也给取出来.

③硬盘数

这个主要是让我们看挂载情况的.而不是去看硬盘数的.
那么如何查看我们的硬盘数呢?

通过观察去查看,sda,sdb,sdc.
说明sda1和sda2是同一块硬盘.
也就是说我们只需要去过滤sd[a-z]就可以了.

最可靠的是后面多加一个冒号.

因为这个冒号为中文的所以我们最后加的也是中文的冒号.
快速切换中英文
符号全部显示为英文or中文

-
临时生效,重连失效.
- 这个export也可以不要.



④磁盘使用率

有更简单的方法直接取出/根分区

⑤进程


🧣综合巡检脚本
#!/bin/bash#author heimasource /etc/profile#1,基本信息ip=`hostname -I`echo '##############################################################################'echo "主机名为:`hostname` IP地址为:`hostname -I | awk '{print $1}'` "echo '##############################################################################'
#2,负载信息load1=`uptime | awk -F'[ ,]+' '{print $(NF-2)}'`load5=`uptime | awk -F'[ ,]+' '{print $(NF-1)}'`load15=`uptime | awk -F'[ ,]+' '{print $(NF)}'`
echo '##############################################################################'echo "系统负载信息"echo "最近1分钟负载: ${load1}"echo "最近5分钟负载: ${load5}"echo "最近15分钟负载:${load15}"echo '##############################################################################'
#3. 内存和swapmem_total=`free -m |awk 'NR==2{print $2}'`mem_used=`free -m |awk 'NR==2{print $3}'`mem_used_percent=`free -m |awk 'NR==2{print $3/$2*100"%"}'`#这两个写的都差不多.swap_total=`free -m |awk 'NR==3{print $2}'`swap_used=`free -m [awk 'NR==3{print $3}'`swap_used_percent=`free -m |awk 'NR==3{print $3/$2*100"%"}'`echo '##############################################################################'echo "内存和swap信息"echo "总计内存大小:${mem_total}MB"echo "使用的内存:${mem_used}MB"echo "内存的使用率:${mem_used_percent}"echo '##############################################################################'echo "总计swap大小:${mem_total}MB"echo "使用的swap: ${mem_used}MB"echo "swap的使用率:${mem_used_percent}"echo '##############################################################################'
#4.磁盘disk_count=`fdisk -l | grep '/dev/sd[a-z][::]'|wc -l`root_total_size=`df -h|awk '$NF=="/"{print $2}'`root_used_percent=`df -h|awk '$NF=="/"{print $5}'`echo '##############################################################################'echo "磁盘信息"echo "硬盘数量:${disk_count}"echo "根分区大小:${root_total_size}"echo "根分区使用率:${root_used_percent}"echo '##############################################################################'
#5. 进程信息proc_total=`top -bn1 |awk 'NR==2{print $2}'`proc_running=`top -bn1 |awk 'NR==2{print $4}'`proc_stopped=`top -bn1 |awk 'NR==2{print $(NF-3)}'`proc_zombine=`top -bn1 |awk 'NR==2{print $(NF-1)}'`echo '##############################################################################'echo "进程信息"echo "进程总数:${proc_total}"echo "运行中的进程数:${proc_running}"echo "挂起的进程数量:${proc_stopped}"echo "僵尸进程数量: ${proc_zombine}"echo '##############################################################################'
把运行这个脚本的命令写入定时任务里面.并且每分钟都运行一次.
我们先来看看,如果没有把结果写入到一个文件里面会发生什么事情.

来自Centos7
-
现在麒麟Kylin v10的日志里面也能看到命令输出的信息了.
-
最好是先来一个文件接收,看看执行的有问题没有.
- **没什么问题在重定向为空**

- 运行脚本使用bash或者sh(如果不指定bash或sh 需要给脚本文件加x权限)

04.同步至邮箱
网页邮箱的配置
#重新注册网易邮箱
现在呢,我们有这个日志文件呢,但是呢,我们想把它发送给别的人.
- 用邮件发送


如果授权码忘记了,那就把下面的设备删除重新弄一个.
注意:这个授权码是会定时更新的,90天一更新,到时候就需要重新来一个授权码了.

BA2hK34GKED9PybC
发送邮件
部署mailx服务
yum -y install mailx

[root@oldboy cron]#rpm -qc mailx
/etc/mail.rc
主要就是这个配置文件

这个文件在**/etc/mail.rc**
如果你用的是qq邮箱,把下面的163改为qq
set from=jiuhao_linux@163.com#配置发件人
set smtp=smtps://smtp.163.com:465#配置使用163发送邮件 如果是非加密smtp.163.com#非加密默认端口是25
set smtp-auth-user=jiuhao_linux@163.com#用户名:邮箱名字
set smtp-auth-password=BA2hK34GKED9PybC#授权码
set smtp-auth=login#认证形式login
#下面3行用于配置加密方式进行传输set nss-config-dir=/etc/pki/nssdb/set smtp-user-starttlsset ssl-verify=ignoremail -s 选项
-s 选项后面跟的是“邮件主题”

把文件的内容以邮件的形式发送过去了.
证书许可

把这一串,许可证的也弄上去.
- 可以没有,但是最好还是要有的.
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/163.crtcertutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crtcertutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crtcertutil -L -d /etc/pki/nssdb/cd /etc/pki/nssdb/certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt

这样弄完,这个许可证就算成功了的.

完善定时任务
监控
[root@oldboy home]#crontab -l
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin”
*/15 * * * * sh /home/run.sh &> /home/log.txt
每隔15分钟监控一次!
*/15 * * * * mail -s "巡检脚本_$(date +\%F_\%H_\%M)" jiuhao996@qq.com < /home/log.txt定时任务配置文件中不识别%
- **转义\%**
定时任务中放两个任务
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




