Linux计划任务与日志

计划任务

  • 计划任务主要是做一下周期性的任务 ,目前主要用途是定期备份数据

一次调度执行at

  • 语法格式

    shell 复制代码
    at <TIMESPEC>
        now +5min
        teatime tomorrow (teatime is 16:00)
        noon +4 days
        5pm august 3 2021
  • 例1

    shell 复制代码
    [root@localhost ~]#yum install -y at
    [root@localhost ~]#systemctl start atd
    [root@localhost ~]#systemctl enable atd
    [root@localhost ~]#at now+1min
    at>useradd zhangsan
    at> <EOT>		#ctrl+D结束
    job 1 at Thu Aug 27 15:35:00 2020
    [root@localhost ~]#atq	#显示系统中待执行的任务列表
    1 Thu Aug 27 15:35:00 2020 a root
    [root@localhost ~]# id zhangsan
    uid=6671(zhangsan) gid=6671(zhangsan) 组=6671(zhangsan)
  • 例2

    shell 复制代码
    [root@localhost ~]#vi at.jobs
    touch /root/`date +%F`.txt
    useradd eagleslab
    [root@localhost ~]#at now+1min < at.jobs
    [root@localhost ~]#ls
    2020-08-27.txt anaconda-ks.cfg at.jobs
    [root@192 ~]# id eagleslab
    uid=6672(eagleslab) gid=6672(eagleslab) 组=6672(eagleslab)
  • /etc/at. {allow ,deny}控制用户是否能执行at任务

    • 白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令
    • 黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的用户则可执行
    • 如果两个文件都不存在,则只有root可以执行at命令

循环调度执行cron用户级

  • cron在使用之前必须要启动守护进程
shell 复制代码
[root@localhost ~]#systemctl start crond
[root@localhost ~]#systemctl enable crond
[root@localhost ~]#ps aux | grep crond
root 6242 0.3 0.0 126380 1656 ? Ss 16:27 0:00
/usr/sbin/crond -n
  • crond进程每分钟会处理一次计划任务

  • 存储位置

    shell 复制代码
    [root@localhost ~]#ls /var/spool/cron
  • 管理命令

    shell 复制代码
    [root@localhost ~]#crontab -l    #列出当前用户所有计划任务
    [root@localhost ~]#crontab -r    #删除当前用户计划任务
    [root@localhost ~]#crontab -e	 #编辑当前用户计划任务
    管理员可以使用 -u username,去管理其他用户的计划任务
    [root@localhost ~]#vi /etc/cron.deny    #这个文件中加入的用户名无法使用cron,也就是黑名单
  • cron语法格式

    shell 复制代码
    分 时 日 月 星期 命令
    * 表示任何数字都符合
    0 2 * * * /run.sh # 每天的2点
    0 2 14 * * /run.sh # 每月14号2点
    0 2 14 2 * /run.sh # 每年2月14号2点
    0 2 * * 5 /run.sh # 每个星期5的2点
    0 2 * 6 5 /run.sh # 每年6月份的星期5的2点
    0 2 2 * 5 /run.sh # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
    0 2 2 6 5 /run.sh # 每年6月2号或者星期5的2点
    /5 * * * * /run.sh # 每隔5分钟执行一次
    0 2 1,4,6 * * /run.sh # 每月1号,4号,6号的2点
    0 2 5-9 * * /run.sh # 每月5-9号的2点
    * * * * * /run.sh # 每分钟
    0 * * * * /run.sh # 每整点
    * * 2 * * /run.sh # 每月2号的每分钟

循环调度执行cron系统级

  • 临时文件的清理 /tmp /var/tmp
  • 系统信息的采集 sar
  • 日志的轮转(切割) logrotate
  • 通常不是由用户定义
  • 文件的位置
shell 复制代码
[root@localhost ~]#vim /etc/crontab		#默认没有定义任何计划任务
[root@localhost ~]# ls /etc/cron.d # 定义的计划任务每个小时会执行
0hourly
[root@localhost ~]#cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly # 每小时01分以root身份执行/etc/cron.hourly/目录下的所有脚本
  • crond仅仅会执行每小时定义的脚本/etc/cron.hourly
shell 复制代码
[root@localhost ~]#ls /etc/cron.hourly
[root@localhost ~]#cat /etc/cron.hourly/0anacron
/usr/sbin/anacron -s # anacron是用来检查是否有错过的计划任务需要被执行
[root@localhost ~]# vi /etc/anacrontab
1 5 cron.daily nice run-parts /etc/cron.daily
#每天开机 5 分钟后就检查 /etc/cron.daily 目录内的文件是否被执行,如果今天没有被执行,那就执行
7 25 cron.weekly nice run-parts /etc/cron.weekly
#每隔 7 天开机后 25 分钟检查 /etc/cron.weekly 目录内的文件是否被执行,如果一周内没有被执行,就会执行
©monthly 45 cron.monthly nice run-parts /etc/cron.monthly
#每隔一个月开机后 45 分钟检查 /etc/cron.monthly 目录内的文件是否被执行,如果一个月内没有被执行,那就执行

日志管理基础

处理日志的进程

rsyslogd :绝大部分日志记录,和系统操作有关,安全,认证sshd,su,计划任务 at,cron
httpd/nginx/mysql 等等应用可以以自己的方式记录日志

shell 复制代码
[root@localhost ~]#ps aux |grep rsyslogd
root 6789 0.2 0.2 216416 4068 ? Ssl 14:17 0:00
/usr/sbin/rsyslogd -n

日志可以存放在本地

日志可以存放在远程服务器

常见的日志文件(系统、进程、应用程序)

日志文件 作用描述
tail /var/log/messages 系统主日志文件
tail -20 /var/log/messages
tail -f /var/log/messages 动态查看日志文件的尾部
tailf /var/log/secure 认证、安全
tail /var/log/maillog 和邮件postfix相关
tail /var/log/cron crond、at进程产生的日志
tail /var/log/dmesg 和系统启动相关
tail /var/log/audit/audit.log 系统审计日志
tail /var/log/yum.log yum
tail /var/log/mysqld.log MySQL
tail /var/log/xferlog 访问FTP服务器相关
w 当前登录的用户 /var/log/wtmp
last 最近登录的用户 /var/log/btmp
lastlog 所有用户的登录情况 /var/log/lastlog

案例1:统计登录失败top5

shell 复制代码
[root@localhost ~]#grep -i 'Fail' /var/log/secure |awk '{print $11}' |sort |uniq -c |sort -k1 -n -r |head -5
#grep筛选	  -i不区分大小写
#awk文本分析处理工具
#sort排序
#uniq去重   -c显示重复几次
#head  查看开头的n行
779 hadoop
501 test
261 183.240.132.21
224 user
21 195.54.160.183

awk语法详见博客(6条消息) Linux命令之awk详细介绍_速趴赛亚金的博客-CSDN博客_linux中awk啥意思

案例2:统计登录成功

shell 复制代码
[root@localhost ~]# grep 'Accepted' /var/log/secure |awk '{print $(NF-3)}' |sort |uniq -c
4 117.90.214.165
2 122.194.35.187
# 直接写$(NF) 指的就是最后一列
# 如果是$(NF-3) 减去3,就是倒数第四列

案例3:查看网卡是否已被驱动

shell 复制代码
[root@localhost ~]# grep -i eth /var/log/dmesg
[ 2.090634] e1000 0000:02:01.0 eth0: (PCI:66MHz:32-bit) 00:0c:29:bb:9a:bb
[ 2.090642] e1000 0000:02:01.0 eth0: Intel(R) PRO/1000 Network Connection

rsyslogd子系统

shell 复制代码
[root@localhost ~]#rpm -qc rsyslog
/etc/logrotate.d/syslog # 日志轮转(切割)相关
/etc/rsyslog.conf # rsyslogd的主配置文件
/etc/sysconfig/rsyslog # rsyslogd相关文件
shell 复制代码
[root@localhost ~]#vim /etc/rsyslog.conf
# 告诉rsyslogd进程 哪个设备(facility),关于哪个级别的信息,以及如何处理
authpriv.* /var/log/secure
mail.* -/var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*
authpriv.* * #
所有终端
authpriv.* @192.168.1.123 #
UDP
authpriv.* @@192.168.1.123 #
TCP

设备facility相关内容,查看man手册https://man7.org/linux/man-pages/man3/syslog.3.html

设备类型(表示日志类型) 解释
LOG_AUTHPRIV 安全认证
LOG_CRON cron 和 at
LOG_DAEMON 后台进程
LOG_FTP ftp进程
LOG_KERN 内核信息
LOG_LOCAL0 through LOG_LOCAL7 用户自定义设备
LOG_LPR 打印机子系统
LOG_MAIL 邮件系统
LOG_NEWS 新闻子系统
LOG_SYSLOG syslogd自身产生的日志
级别(日志重要级别) 解释
LOG_EMERG 紧急,致命,服务无法继续运行,如配置文件丢失
LOG_ALERT 报警,需要立即处理,如磁盘空间使用95%
LOG_CRIT 致命行为
LOG_ERR 错误行为
LOG_WARNING 警告信息
LOG_NOTICE 普通
LOG_INFO 标准信息
LOG_DEBUG 调试信息,排错才开,一般不建议使用
  • 案例1
    • 将authpriv设备日志记录到/var/log/auth.log
shell 复制代码
vim /etc/rsyslog.conf
#authpriv.* /var/log/secure
authpriv.* /var/log/auth.log
  • 案例2
  • 改变应用程序sshd的日志设备为local5,并定义local5设备日志记录到/var/log/local5.local
shell 复制代码
1.设置ssh程序的日志设备为自定义设备
# vim /etc/ssh/sshd_config
#SyslogFacility AUTHPRIV
SyslogFacility LOCAL5

2.设置自定义设备日志文件存储位置
# vim /etc/rsyslog.conf
local5.* /var/log/local5.local

3.重启生效
# systemctl restart sshd
# systemctl restart rsyslog

4.尝试登录,触发日志

5.观察日志,理解自定义日志设备
# ll /var/log/local5.local
-rw-------. 1 root root 201 /var/log/local5.local
cat /var/log/local5.local
  • 案例3
    • 使用logger程序写日志到指定的设备及级别
shell 复制代码
logger "run....."
logger -p emerg "run......"
logger -p authpriv.info "run......"
  • 案例4
    • rsyslog远程管理日志

1.修改server1的rsyslog.conf配置文件,打开tcp\udp监听端口

shell 复制代码
[root@server1 ~]#vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

2.重启rsyslog,检查端口是否在监听

shell 复制代码
[root@server1 ~]#systemctl restart rsyslog
[root@server1 ~]#yum install net-tools -y
[root@server1 ~]#netstat -ntup | grep 514
tcp   0 0 0.0.0.0:514  0.0.0.0:*  LISTEN 1342/rsyslogd
tcp6  0 0 :::514       :::*       LISTEN 1342/rsyslogd
udp   0 0 0.0.0.0:514  0.0.0.0:*         1342/rsyslogd
udp6  0 0 :::514       :::*              1342/rsyslogd

3.修改server2的ssh配置文件,将日志发送到local0中,并重启sshd

shell 复制代码
[root@server2 ~]#vim /etc/ssh/sshd_config
SyslogFacility LOCAL0
[root@server2 ~]#systemctl restart sshd

4.修改server2的rsyslog.conf,并重启rsyslog

shell 复制代码
[root@server2 ~]# vim /etc/rsyslog.conf
local0.*                     @192.168.80.193
[root@server2 ~]# systemctl restart rsyslog.service

5.最后使用tailf在server1上监听server2的日志

logrotate日志轮转

注:针对任何日志文件(rsyslog日志、Nginx访问或错误日志)

logrotate(轮转,日志切割)

  • 如果没有日志轮转,日志文件会越来越大
  • 将丢弃系统中最旧的日志文件,以节省空间
  • logrotate本事不是系统守护进程,它是通过计划任务crond每天执行
shell 复制代码
[root@localhost ~]#cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status
/etc/logrotate.conf
# 日志轮转状态/var/lib/logrotate/logrotate.status
# 日志轮转规则按照/etc/logrotate.conf中来
shell 复制代码
[root@localhost ~]#ls /etc/logrotate.conf /etc/logrotate.d/
/etc/logrotate.conf
/etc/logrotate.d/:
bootlog chrony syslog wpa_supplicant yum
  • 主配置文件
shell 复制代码
[root@localhost ~]#vim /etc/logrotate.conf
weekly # 一周轮转一次
rotate 4 # 保留4份日志,也就是说,如果进行了5次日志轮替,就会删除第一个备份日志文件
create # 主动创建新的日志文件
dateext # 使用日期来作为文件名的后缀
#compress # 每次轮转需不需要进行压缩
include /etc/logrotate.d # 导入其他应用的日志轮转规则
include /etc/logrotate.d # 导入其他应用的日志轮转规则
/var/log/wtmp { # 以下参数仅对此目录有效,对该日志文件设置轮转的方法
    monthly # 一个月轮转一次
    create 0664 root utmp # 轮转后创建新文件,并设置权限
    minsize 1M # 最小达到1M才会轮转
    rotate 1
}
/var/log/btmp {
    missingok # 丢失不提醒
    monthly
    create 0600 root utmp
    rotate 1
}

参数:

monthly 日志文件将按月轮循。其它可用值为'daily','weekly'或者'yearly'。
rotate 5 一次将存储5个归档日志。对于第六个归档,时间最久的归档将被删除。
compress 在轮循任务完成后,已轮循的归档将使用gzip进行压缩。
delaycompress 总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。
missingok 在日志轮循期间,任何错误将被忽略,例如"文件无法找到"之类的错误。
notifempty 如果日志文件为空,轮替不会进行。
sharedscripts 以下脚本只执行一次
create 644 root root 以指定的权限创建全新的日志文件,同时logrotate也会重命名原始日志文件。
postrotate/endscript 在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd 进程将立即再次读取其配置并继续运行。
size大小 日志只有大于指定大小才进行日志轮替,而不是按照时间轮替,如size 100k
minsize大小 日志轮替的最小值,也就是日志一定要达到这个最小值才会进程轮转,否则就算达到时间也不轮替
  • 举例
shell 复制代码
http自己有自己预先写好的轮替,不过我们可以把他移走,自己写一个
[root@localhost ~]#cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    #以下脚本只执行一次
    delaycompress
    postrotate
    #在日志轮替结束之后,执行以下脚本
    /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    #重载apache服务
    endscript
    #脚本结束
}
[root@localhost ~]#mv /etc/logrotate.d/httpd ~
[root@localhost ~]#vim /etc/logrotate.conf
"/var/log/httpd/access_log" /var/log/httpd/error_log {
#日志轮替的是/var/log/httpd/中RPM包默认安装的apache正确访问日志和错误日志
    rotate 5
    #轮替5次
    mail www@my.org
    #把信息发送到指定邮箱
    size 100k
    #日志大于100KB时才进行日志轮替,不再按照时间轮替
    create 644 root root
    sharedscripts
    #以下脚本只执行一次
    postrotate
    #在日志轮替结束之后,执行以下脚本
    	/usr/bin/killall -HUP httpd
    #重启apache服务
    endscript
    #脚本结束
}
不过改完要记得去手动执行一下/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf这个命令,这个是每天他会自己去定时任务启动轮替的,执行一次就切割一次
[root@localhost ~]#cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status
/etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
相关推荐
面汤放盐3 分钟前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算
子琦啊24 分钟前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法
跨境数据猎手1 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
AOwhisky1 小时前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
小龙在慢慢变强..2 小时前
目录结构(FHS 标准)
linux·运维·服务器
2035去旅行2 小时前
嵌入式开发,如何选择C标准库
linux·arm开发
刘延林.2 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
星恒讯工业路由器2 小时前
星恒讯工业生产自动化解决方案
运维·物联网·自动化·智能路由器·信息与通信
a8a3022 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx