定时任务

3045 字
15 分钟
定时任务

定时任务#

[TOC]



01.定时任务#

概述#

什么是定时任务?

  1. 定时起床 闹钟 6点

  2. 时间同步、间隔15分钟同步一次

  3. 打包压缩(业务低谷期)

  • ​定时定点的执行一些流程,或者是一些任务.或者是备份.

部署#

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

systemctl status crond

目录结构#

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

命令#

/var/spool/cron/用户名

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

crontab -r (删除)#

当前用户的定时任务配置文件删除

格式#

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

  • 这个*之间得有空格.

  1. 案例.每月1号凌晨4点执行

    - 00 04 01 * *
  2. 案例.每小时的第15分钟执行命令

    - 15 * * * *

特殊符号#

  • 注意第二个隔天的

  1. 案例.每天上午2点到12点间隔2个小时执行命令

    - 00 2-12/2 * * *
  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中的命令.

验证

解决方案#

Terminal window
#重新定义
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系统中设置定时任务的方式有两种

  1. 系统定时任务

  2. 用户定时任务

  1. 系统配置

直接编辑文件即可 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

  1. ​用户配置

**使用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天切割一次

  2. 这里我们测试实验,间隔1分钟一次

  3. 切割后的文件按照时间精确到分钟命名

  4. 清空原文件继续接收新的日志

  5. 本质就是把原文件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 heima
source /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. 内存和swap
mem_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

Terminal window
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-starttls
set ssl-verify=ignore

mail -s 选项#

-s 选项后面跟的是“邮件主题”

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

证书许可#

把这一串,许可证的也弄上去.

  • 可以没有,但是最好还是要有的.
Terminal window
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/163.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt
certutil -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分钟监控一次!

Terminal window
*/15 * * * * mail -s "巡检脚本_$(date +\%F_\%H_\%M)" jiuhao996@qq.com < /home/log.txt

定时任务配置文件中不识别%

- **转义\%**

定时任务中放两个任务

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

定时任务
https://www.kpyun.fun/posts/basics/core/core19/
作者
久棹
发布于
2025-08-24
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录