第十四篇:定时任务服务
定时任务服务使用流程
定时任务:用户在指定的时间自动执行脚本或命令
服务使用流程
服务使用流程 | 说明 |
部署 | 安装这个服务或软件 |
配置 | 通过配置文件和命令使用这个服务 |
优化或注意事项 | 安全 |
排障 |
|
其他 |
|
部署定时任务
- crond:是一个守护进程,用来执行定时任务表(crontab)定义好的任务
- cronie:定时任务软件包名字
- crontab:定时任务管理的命令,对定时任务的规则进行增删改查
rpm -qa cronie # 检查软甲包是否安装 rpm -ql cronie # 查看软件包中的内容
目录结构 | 说明 |
/var/spool/cron/ | 用户定时任务的配置文件的目录 |
/var/log/cron | 定时任务日志 |
/etc/crontab | 系统定时任务的配置文件(不推荐使用) |
/etc/cron.hourly/ | 系统定时任务,每小时运行 |
/etc/cron.daily/ | 系统定时任务,每天运行 |
/etc/cron.weekly/ | 系统定时任务,每周运行 |
/etc/cron.monthly/ | 系统定时任务,每月运行 |
配置定时任务
配置命令
crontab:对定时任务的规则进行增删改查
crontab选项 | ||
crontab -e | edit编辑当前用户的定时任务 | vim /var/spool/cron/root #root当前用户的名称 |
crontab -l | list查看当前用户的定时任务 | cat /var/spool/cron/root #root当前用户的名称 |
[root@yuan ~]# crontab -l no crontab for root # 用户未设置定时任务 [root@yuan ~]# crontab -e no crontab for root - using an empty one # 用户未设置定时任务,给你创建一个空的 crontab: installing new crontab # 更新了新的定时任务的配置
定时任务时间书写格式
定时任务时间部分的特殊符号
时间符号 | 说明 | 案例 |
/ | 每隔…时间 | */2 * * * * 每隔2分钟运行 |
- | 表示范围 | 00 08-22 * * * 08-22点的每个小时运行 |
, | 表示独立的时间 | 00 08,12,14 * * * 08,12,14点运行 |
* | 每,全部/所有 |
*在分钟的位置上:表示每分钟的意思 *在小时的位置上:表示每小时的意思 |
排障
- 没有日志(crond、rsyslog服务没有运行)
- 没有结果(手动运行对应的脚本或命令)
- 调试脚本
# 调试脚本的方法
sh -x 或 bash -x,显示脚本执行过程
以+开头的表示脚本执行的过程
开头没有+,表示输出
[root@yuan ~]# sh -x /tmp/sys.log
++ hostname
+ hostname=yuan
++ hostname -I
+ ip='10.0.0.200 '
+ echo '####基础信息####'
####基础信息####
定时任务案例
案例01:每两分钟同步系统的时间
- 时间+命令格式
- ntpdate ntp1.aliyun.com
# 书写在定时任务配置文件 # 注释 */2 * * * * /sbin/ntpdate ntp1.aliyun.com 命令写绝对路径
案列02:每天定时备份/etc/到/backup/下面
# 创建脚本文件及写入命令 mkdir -p /my_server/scripts vim /my_server/scripts/backup-etc.sh (脚本文件以.sh .bash结尾) tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/ # 定时备份 # 注释 00 00 * * * /bin/sh /my_server/scripts/backup-etc.sh
案例03:打包备份(脚本+变量)
在脚本中需要重复使用的内容,可以将内容存到变量中
# Linux变量命名规则 Linux中变量命名需以字母或下划线开头 可包含字母、数字和下划线 且区分大小写 不能含空格或特殊字符 # 赋值、取值 # 写入固定的内容 dir='/my_server/scripts/' echo $dir
echo ${dir} # 写入命令(变量中存放的时命令的结果) now_time=`date +%F_%T` echo $now_time
[root@yuan ~]# cat /my_server/scripts/backup-etc.sh #!/bin/bash time=`date +%F_%w_%H` tar zcf /backup/etc-$time.tar.gz /etc/
定时任务故障案例
定时任务直接书写的时候%有特殊含义
* * * * * /bin/echo "Hello World %100" >>/root/yuan.txt 2>&1 # 文件中不会输入任何的内容 * * * * * /bin/echo "Hello World \%100" >>/root/yuan.txt 2>&1 # 文件中输入对应的内容 # 如果使用脚本,则不会出现该故障
定时任务中关于命令路径的故障
- 定时任务运行命令或脚本时,只能识别/bin或/usr/bin目录下的命令
- 只要不在这些目录下的命令,就要使用绝对路径或重新定义PATH环境变量
# 现象 命令行执行命令或脚本是成功的,在定时任务中执行时,提示命令找不到 # 原因 定时任务运行脚本或命令时只能识别/bin和/usr/bin目录下的命令,其他的命令无法识别 # 解决办法 绝对路径 在脚本开头,重新定义PATH环境变量或重新加载PATH环境变量 PATH Linux环境变量,存放命令的位置 Linux会在PARH路径中查找,如果有则执行,如果没有则提示command not found/ no such file or directory # 绝对路径 [root@yuan ~]# cat /my_server/scripts/test-info.sh #!/bin/bash hostname /sbin/ip address show eth0 # 重新定义PATH [root@yuan ~]# cat /my_server/scripts/test-info.sh #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin hostname ip address show eth0 # 重新加载PATH [root@yuan ~]# cat /my_server/scripts/test-info.sh #!/bin/bash source /etc/profile # 重新加载PATH环境变量 hostname ip address show eth0
没有定向到空或追加到文件故障案例
- 定向到空 * * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2&1
- 追加到文件 00 01 * * * /bin/sh -x /my_server/scripts/backup-etc.sh >>/tmp/script.log 2>&1
# 现象 邮件服务开启:不断收到邮件 (You have new mail in /var/spool/mail/root) 邮件服务关闭:一些邮件的临时目录不断堆积成小文件 (/var/spool/postfix/maildrop) # 原因 定时任务运行命令或脚本时,命令或脚本有输出,定时任务就会通过邮件形式发送给root # 解决 定时任务中命令或脚本定向到空或追加到文件
定向到空:*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
追加到文件:* * * * * /bin/echo "Hello World \%100" >>/root/yuan.txt 2>&1
定时任务使用案例
定时备份/etc/目录到/backup以ip地址为名的目录中
定时系统巡检(定时输出系统基本信息)
脚本文件:/tmp/sys.log

#!/bin/bash #author:yuanxiaojiang #desc:系统巡检基本脚本 #version:1 # 1.基础信息 hostname=`hostname` ip=`hostname -I` echo '####################基础信息####################' echo "主机名:$hostname" echo "ip地址:$ip" echo '################################################' #2.负载信息 load1=`uptime |awk -F '[ ,]+' '{print $(NF-2)}'` load5=`uptime |awk -F '[ ,]+' '{print $(NF-1)}'` load15=`uptime |awk -F '[ ,]+' '{print $(NF)}'` echo '####################负载信息####################' echo "最近1分钟:$load1" echo "最近5分钟:$load5" echo "最近15分钟:$load15" echo '################################################' #3.内存信息 mem_total=`free |awk -F '[ ]+' 'NR==2 {print $2}'` mem_used=`free |awk -F '[ ]+' 'NR==2 {print $3+$6}'` mem_used_percent=`free |awk -F '[ ]+' 'NR==2 {print ($3+$6)/$2*100"%"}'` echo '####################内存信息####################' echo "内存总计:$mem_total" echo "内存使用:$mem_used" echo "内存使用率:$mem_used_percent" echo '################################################' #4.swap信息 swap_total=`free |awk -F '[ ]+' 'NR==3 {print $2}'` swap_used=`free |awk -F '[ ]+' 'NR==3 {print $3}'` swap_used_percent=`free | awk -F '[ ]+' 'NR==3 {if ($2!=0) {print $3/$2*100"%"} else {print "无swap"}}'` echo '####################内存信息####################' echo "swap总计:$swap_total" echo "swap使用:$swap_used" echo "swap使用率:$swap_used_percent" echo '################################################' #5.磁盘信息 disk_total=`fdisk -l |grep '/dev/[sv]d[a-z][::]' |wc -l` root_size=`df -h |awk '$NF=="/"{print $2}'` root_size_percent=`df -h |awk '$NF=="/"{print $5}'` echo '####################磁盘信息####################' echo "磁盘数量:$disk_total" echo "根分区大小:$root_size" echo "根分区使用率:$root_size_percent" echo '################################################' #6.进程信息 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 $8}'` proc_zombie=`top -bn1 |awk 'NR==2{print $10}'` echo '####################内存信息####################' echo "进程总数:$proc_total" echo "运行的进程:$proc_running" echo "挂起进程:$proc_stopped" echo "僵尸进程:$proc_zombie" echo '################################################'
发送邮件
获取授权码
Linux配置/etc/mail.rc
vim /etc/mail.rc #写到该配置文件最后面 # 未加密的方式发送(25端口) set from=your_mail@163.com # 发件人地址 set smtp=smtp.163.com # 指定SMTP服务器的地址和端口 set smtp-auth-user=your_mail@163.com # 设置SMTP身份验证的用户名 set smtp-auth-password=授权码 # 设置SMTP身份验证的密码(授权码) set smtp-auth=login # 指定SMTP身份验证的方法 # 加密的方式发送(465端口) set nss-config-dir=/etc/pki/nssdb/ # 指定NSS配置目录(通常用于存储证书和密钥的数据库) set smtp-user-starttls # 启动STARTTLS,提高安全性 set ssl-verify=ignore # 配置SSL验证为忽略 set from=your_mail@163.com set smtp=smtps://smtp.163.com:465 set smtp-auth-user=your_mail@163.com set smtp-auth-password=授权码 set smtp-auth=login
发送邮件及其附件
# 发送邮件 mail -s "邮件主题" recipient@example.com <邮件内容 # 发送邮件及其附件 echo "邮件附件" |mail -s "邮件主题" -a 邮件内容 recipient@example.com
将邮件内容转换成csv表格(通过逗号分隔内容)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现