计划任务
- 计划任务主要是做一下周期性的任务 ,目前主要用途是定期备份数据
一次调度执行at
-
语法格式
shellat <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