2023.6.701.Linux系统计划任务

发布时间 2023-06-07 23:11:21作者: 必兮相语--
01.Linux系统计划任务
1.Crond计划任务概述
2.crond配置⽂件详解
3.crond计划任务管理
4.crond配置编写实例
5.crond计划任务调试
Atuor: Wing
vx: WingspanGo
1.Crond计划任务概述
什么是计划任务,计划任务类似于我们平时⽣活中的闹钟。
在 Linux 系统的计划任务服务 crond 可以满⾜周期性执⾏任务的需求。
crond 进程每分钟会处理⼀次计划任务, 计划任务主要是做⼀些周期性的任务⽬前最主要的⽤途是定时备份数据
 
Schedule one-time tasks with at. ⼀次性调度执⾏ at
Schedule recurring jobs with cron. 循环调度执⾏ cron
Schedule recurring system jobs. 所有计划任务执⾏中的输出都会以邮件的⽅式发送给指定⽤户, 除⾮重定向
分布式调度xxjob等
//循环调度执⾏cron 进程每分钟会处理⼀次计划任务
[root@wing ~]# systemctl status crond.service
[root@wing ~]# ps aux |grep crond
root 1201 0.0 0.0 126264 1640 ? Ss 11:15 0:00 /usr/sbin/crond -n
 
计划任务分为以下两种情况:
1.系统级别的定时任务:
清理系统缓存
临时⽂件清理
系统信息采集
⽇志⽂件切割
2.⽤户级别的定时任务:
定时同步互联⽹时间
定时备份系统配置⽂件
定时备份数据库⽂件
定时跑任务接⼝等等
2.crond配置⽂件详解
⽂件 说明
/etc/crontab //Crontab配置⽂件
/etc/cron.deny //该⽂件中所列⽤户不允许使⽤crontab命令
/var/spool/cron/* //所有⽤户定时⽂件都存放此⽬录,⽂件以⽤户名命名
/var/log/cron*/ //定时任务执⾏后的⽇志⽂件,可⽤来回溯
 
3.crond计划任务管理
crond任务管理
参数 含义 指定示例
[root@wing ~]# crontab --help
-e 编辑crontab⽂件内容 crontab -e
-l 查看crontab⽂件内容 crontab -l
-r 删除crontab⽂件内容 crontab -r
-u 管理其他⽤户的计划任务 crontab -u wing -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username
 
crond时间含义
# 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
// * 表示任意的(分、时、⽇、⽉、周)时间都执⾏
// - 表示⼀个时间范围段, 如5-7点
// , 表示分隔时段, 如6,0,4表示周六、⽇、四
// /1 表示每隔n单位时间, 如*/10 每10分钟
 
crond编写示例
00 02 * * * ls //每天2:00整
00 02 1 * * ls //每⽉1号2:00整
00 02 14 2 * ls //每年2⽉14号2:00整
00 02 * * 7 ls //每周⽇2:00整
00 02 * 6 5 ls //每年6⽉的周五2:00整
00 02 14 * 7 ls //每⽉14号2:00整或每周⽇2:00整,这两个时间都执⾏
00 02 14 2 7 ls //每年 2 ⽉ 14 号 2:00 整 或者 每周⽇ 2:00 整,这两个时间都执⾏
00 02 * * * ls //每天2:00整
* 02 * * * ls //每天2:00中的每⼀分钟 (逻辑错误)
* * * * * ls //每分钟执⾏ ls
* * 14 2 * ls //2⽉14号的每分钟(逻辑错误)
*/5 * * * * ls //每隔5分钟
00 02 * 1,5,8 * ls //每年1,5,8⽉的每天2:00整
00 02 1-8 * * ls //每⽉1到8号的2:00整
 
crond书写规范
 
//1.为计划任务增加必要的注释
[root@wing ~]# crontab -l
##time sync by wing 2023-03-19
*/5 * * * * /usr/sbin/ntpdate time.windows.com &>/dev/null
//2.规范计划任务执⾏脚本存放的路径/soft/scripts/
[root@wing ~]# crontab -l
##backup www to /backup wing 2023-03-19
00 01 * * * /bin/sh /soft/scripts/www_backup.sh &>/dev/null
//3.执⾏shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
//调试好后应屏蔽debug输出信息,避免产⽣系统垃圾占⽤过多inode, 如需输出⽇志, 可重定向⾄⽇志⽂件
[root@wing ~]# crontab -l
####backup www to /backup wing 2023-03-19
00 01 * * * /bin/sh /soft/scripts/www_backup.sh &>/dev/null
 
4.crond配置编写实例
[root@wing ~]# crontab -e
#每天凌晨切割nginx⽇志
00 00 * * * /bin/sh -x /soft/scripts/cut_nginx.sh &> /soft/scripts/log/nginx.log
#每天5点备份数据库
00 05 * * * /bin/sh -x /soft/scripts/dump_sql.sh &>/soft/scripts/log/mysql.log
#每5分钟检测数据库是否正常
*/5 * * * * /bin/sh /soft/scripts/start_mysql.sh &>/dev/null
 
//注意:
1.我们所有的crond服务是运⾏的程序。⽽crontab命令⽤户⽤来设置定时规则的命令。
2.crond服务是企业⽣产⼯作中常⽤的重要服务,at很少使⽤,可以忽略。
3.⼏乎每个服务器都会⽤到crond服务。
 
cut_nginx.sh
 
#!/bin/bash
# 设置⽇志⽬录和⽂件名
 
log_dir="/var/log/nginx"
log_file="access.log"
# 获取昨天的⽇期
yesterday=$(date -d "yesterday" +"%Y-%m-%d")
# 切割⽇志⽂件
mv $log_dir/$log_file $log_dir/$log_file.$yesterday
# 发送信号,使Nginx重新打开⽇志⽂件
kill -USR1 $(cat /run/nginx.pid)
# 清理过期的⽇志⽂件(保留7天内的⽇志⽂件)
find $log_dir -name "*.log.*" -mtime +7 -exec rm {} \;
 
dump_sql.sh
 
#!/bin/bash
# Database credentials
USER="root"
PASSWORD="xxx"
# Backup directory
BACKUP_DIR="/var/backups/mysql"
# MySQL dump command
DUMP="/usr/bin/mysqldump"
# Get date and time for backup file
NOW=$(date +"%Y-%m-%d-%H-%M-%S")
# Create backup directory if it doesn't exist
mkdir -p $BACKUP_DIR
# Backup each database to a separate file
for db in $(mysql -u $USER -p$PASSWORD -e "show databases;" | grep -Ev "
(Database|information_schema|performance_schema|sys)")
do
$DUMP --single-transaction --skip-lock-tables --user=$USER -p$PASSWORD $db | gzip >
$BACKUP_DIR/$db-$NOW.sql.gz
done
# Delete backups older than 7 days
find $BACKUP_DIR/* -mtime +7 -exec rm {} \;
 
start_mysql.sh
 
#!/bin/bash
# 检查 MySQL 是否正在运⾏
pgrep mysqld > /dev/null
if [ $? -ne 0 ]; then
# MySQL 未运⾏,启动 MySQL 服务
systemctl start mysqld.service
echo "MySQL 服务已启动"
else
# MySQL 已运⾏,输出运⾏状态
echo "MySQL 服务正在运⾏"
fi
5.crond计划任务调试
1.调整任务每分钟执⾏, 检测是否是否正常, 有些任务不要频繁执⾏
2.调整系统时间然后在检测任务, ⽣产不建议直接使⽤此⽅式
3.执⾏脚本, 将脚本执⾏输出写⼊指定⽇志⽂件, 观察⽇志内容是否正常
4.注意⼀些任务命令带来的问题 echo “wing” >>/tmp/test.log &>/dev/null
5.命令使⽤绝对路径, 防⽌⽆法找到命令导致定时任务执⾏故障
6.查看 /var/log/cron ⽇志进⾏调试
建议: 将需要定期执⾏的任务写⼊脚本中, 建⽴ /soft/scripts ⽬录统⼀存放脚本, 脚本中命令必须使⽤绝对
路径,⼿动执⾏脚本检测输出是否正常, 然后将脚本加⼊计划任务测试, 测试后⽆问题将脚本输出写⼊对应的⽇
志⽂件中即可。
1.⼿动执⾏保留执⾏命令的正确结果
2.编写脚本
脚本需要统⼀路径/soft/scripts
脚本开头建议填写注释信息, 包括执⾏时间、周期、任务
脚本内容复制执⾏成功的命令⾄脚本⽂件中(减少每个环节出错⼏率)
脚本内容尽可能的优化, 使⽤⼀些变量或使⽤简单的判断语句
脚本执⾏的输出信息不要随意打印, 可以重定向⾄其他位置保留或丢⼊⿊洞
3.执⾏脚本
使⽤bash执⾏, 防⽌脚本没有增加执⾏权限(/usr/bin/bash)
执⾏命令以及脚本成功后并复制该命令
4.编写计划任务
加上必要的注释信息, ⼈、时间、任务
设定计划任务执⾏的周期
粘贴执⾏脚本的命令(不要⼿敲)
5.调试计划任务
增加任务频率测试、调整系统时间测试(不能⽤于⽣产)
检查环境变量问题、检查crond服务产⽣⽇志进⾏排查