实战:shell脚本+定时任务

目录

手动切割测试

生成脚本,添加定时任务


 

手动切割测试
1. 给nginx进程发送信号,让nginx重新生成一个新日志文件,这就是一个日志切割根本

/var/log/nginx/access.log.bak   # 1.备份原本日志文件

nginx  reload  reopen信号
# 配置文件中定义的日志文件名,是这个
2. /var/log/nginx/access.log  	# 重新生成新日志文件,让新日志往这里去写

# 手动切割,修改日志
# 快速生成日志的两种方式
#1.准备好旧的日志文件,测试写入大量的日志记录,先用第一种办法,for循环
[root@web-7 nginx]# for num in {1..10000};do curl 10.0.0.7 ; done

#2.使用支持多进程,并发写入的工具,如ab命令  apache提供的性能压测命令,给网站发送支持并发的大量的http请求。
[root@master-61 ~]# yum install httpd-tools -y

# 发送10000个http请求,且招来100个人同时发请求
[root@master-61 ~]# ab -c 100 -n 10000  http://10.0.0.7/

# 3.当前日志数量
[root@web-7 nginx]# cat /var/log/nginx/access.log
10287


# 3.让你有一个已经记录了大量日志的文件,得进行日志切割了

切割思路就是,1.先重命名,等于备份  2. 重新记录nginx日志 
(/var/log/nginx/access.log) 按天记录日志 (每天夜里的 整点分进行日志备份日志)

# 备份旧日志(模拟是前一天的旧日志)
cd /var/log/nginx/ && mv access.log access.log.$(date +"%F")

# 还得生成新日志,得继续记录
给nginx进程发送reopen信号,重新生成新日志
# 用这种方式,可以最精确的提取进程id号。

kill -USR1 将 SIGUSR1 信号发送到从前面的命令得到的所有进程 ID。
SIGUSR1 通常用于请求进程执行某些操作,比如重新加载配置等

kill -USR1 $(ps -ef|grep nginx |grep master | awk '{print $2}')

此时会生成新的日志
[root@web-7 ~]# ll /var/log/nginx/
total 1972
-rw-r--r-- 1 www   root   9400 Sep 25 21:32 access.log
-rw-r----- 1 nginx adm  985587 Sep 25 21:30 access.log.2024-09-25
-rw-r----- 1 www   adm   39931 Sep 25 21:32 error.log

此时新日志,就会记录到这个新的日志文件中了
==> all-server-accesss.log <==
/index.html  10.0.0.61 - - [23/May/2022:10:10:56 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.61 - - [23/May/2022:10:10:57 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.61 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
/index.html  10.0.0.61 - - [23/May/2022:10:10:58 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"


对于旧的日志 你最好 创建文件夹去分类管理他们,将它们定期打包压缩和删除
生成脚本,添加定时任务
#1.添加日志切割脚本
[root@web-7 ~]# cat /opt/log_back.sh
#!/bin/bash
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

#1.设置源目录文件
logs_path="/var/log/nginx/"

#2.创建以日期命名的备份目录文件,并进行备份日志
logs_path_backup="$logs_path/$(date -d 'yesterday' +'%F')"

mkdir $logs_path_backup

#.和./*不一样
#.仅代表当前目录  ./*代表当前所有目录文件及子目录文件
#在查找深度为1的文件时用.  因为./*的话会包括下一层子目录
cd $logs_path && find . -maxdepth 1 -type f | xargs -i mv {} {}.$(date -d 'yesterday' +'%F')

cd $logs_path && find . -maxdepth 1 -type f | xargs -i mv {} $logs_path_backup

#3.重新加载nginx配置,产生新的日志文件
kill -USR1 $(ps -ef | grep nginx | grep master | awk '{print $2}')

#2.添加定时任务
[root@web-7 ~]# crontab -l
0 0 * * * /bin/bash /opt/log_back.sh

注意:
问题1:不一定准时执行,是在这一分钟内执行,害得我排查花了一下午,简单几步找不到问题所在
问题2:执行定时任务后需要校时后重新修改时间
问题3:定时任务中一定要添加脚本绝对路径,命令也要带路径
不只有/var/log/cron有日志  cat /var/spool/mail/root也会存在一些
排查思路:
问题1:
先查询脚本内的内容可执行,手动执行一遍
删除定时校时任务
由于网上查的说cron和shell执行环境不一样,于是我在开头进行重设环境变量
然后手动可以执行成功,什么问题也都没有,但是我修改时间后,日志显示没有执行
继续排查,对执行的定时任务进行日志输出到临时文件,检查日志,但是没有执行成功,无日志
最后重新换了一台机器,发现结果仍是一样,没有执行成功
但是有时候看定时任务日志有执行,但是时间不准时
添加显示文件时间的发现定时任务执行时间和文件夹创建时间都不准时,所以导致以为没有执行
问题2:
先使用校时命令
ntpdate -u ntp.aliyun.com
删除日志文件并重新加载nginx配置
rm -rf /var/log/nginx/*
systemctl reload nginx
生成日志
ab -c 100 -n 10000 http://10.0.0.7/
修改时间等待执行
date -s "2024-09-26 23:59:51"

Sep 27 00:00:51 172 CROND[1523]: (root) CMD (/bin/bash /opt/log_back.sh)
Sep 27 00:00:33 172 CROND[1532]: (root) CMD (/bin/bash /root/log_back.sh)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值