计划任务
- 计划任务主要是做一些周期性的任务,可以让某个任务按照我们的预期的时间或计划去执行。
单次调度执行at
安装at软件包:
yum install -y at
启动at服务:
[root@localhost ~]# systemctl start atd
[root@localhost ~]# systemctl enable atd # 开机自启动
语法结构
at [options] time
选项:
- -f:指定包含具体指令的任务文件
- -q:指定新任务的队列名称
- -l:显示待执行任务的列表
- -d:删除指定的待执行任务
或者也可以使用一下命令查看和删除
atq
:查看待执行的任务
atrm
:通过序号删除任务
timespec
now +5min # 从现在开始5分钟后
teatime tomorrow # 明天的下午16:00
noon +4 days # 4天后的中午
11:20 AM # 早上11:20
.....
.....
# 对于at任务的时间写法有很多,不需要记忆,用到的时候查询一下就行
示例一:5分钟后创建一个文件
[root@localhost ~]# at now +5min
at> touch /root/file2
at> <EOT> # ctrl+D 结束任务编辑
job 1 at Fri May 31 21:03:00 2024
[root@localhost ~]# at -l # 查看任务
1 Fri May 31 21:03:00 2024 a root
示例二:通过文件指定任务
[root@localhost ~]# vim at.jobs
useradd testuser
[root@localhost ~]# at -l
[root@localhost ~]# at now +5min -f at.jobs
job 2 at Fri May 31 21:03:00 2024
[root@localhost ~]# at -l
2 Fri May 31 21:03:00 2024 a root
循环调度执行cron
计划任务(Cron)是一种强大的工具,可以自动执行预定的任务。它非常适合定期运行脚本、备份数据、清理临时文件等一系列重复性任务。
crontab:是cron服务提供的管理工具
检查cron服务有没有启动:
[root@localhost ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since 五 2024-05-31 21:30:35 CST; 3min 48s ago
Main PID: 6225 (crond)
CGroup: /system.slice/crond.service
└─6225 /usr/sbin/crond -n
5月 31 21:30:35 localhost.localdomain systemd[1]: Started Command Scheduler.
5月 31 21:30:36 localhost.localdomain crond[6225]: (CRON) INFO (RANDOM_DELAY...
5月 31 21:30:36 localhost.localdomain crond[6225]: (CRON) INFO (running with...
Hint: Some lines were ellipsized, use -l to show in full.
# 启动
systemctl start crond.service
cron计划任务主要分为用户的任务和系统任务,用户任务是又具体某个用户编写的任务,而系统任务则在系统启动时始终生效
cron的基本语法
cron命令的基本语法如下:
crontab [-l | -r | -e | -n | -m]
选项:
-l
:列出当前用户的定时任务。-r
:删除当前用户的定时任务。-e
:编辑当前用户的定时任务。-n
:检查定时任务是否可用。-m
:发送类似于电子邮件的消息,用于通知定时任务执行的结果。
[root@localhost ~]# crontab -l # 列出当前用户所有计划任务
[root@localhost ~]# crontab -r # 删除当前用户计划任务
[root@localhost ~]# crontab -e # 编辑当前用户计划任务
管理员可以使用 -u username,去管理其他用户的计划任务
[root@localhost ~]# vi /etc/cron.deny # 这个文件中加入的用户名无法使用cron
cron任务的配置
每个用户可以通过crontab
命令来编辑自己的任务计划。要编辑cron任务,可以使用crontab -e
命令。
编辑cron任务
要编辑cron任务计划,可以使用以下命令打开cron编辑器:
crontab -e
配置cron任务的格式
cron任务的格式如下:
分 时 日 月 星期 命令
* 表示任何数字都符合
0 2 * * * date >> date.txt # 每天的2点
0 2 14 * * date >> date.txt # 每月14号2点
0 2 14 2 * date >> date.txt # 每年2月14号2点
0 2 * * 5 date >> date.txt # 每个星期5的2点
0 2 * 6 5 date >> date.txt # 每年6月份的星期5的2点
0 2 2 * 5 date >> date.txt # 每月2号或者星期5的2点 星期和日同时存在,那么就是或的关系
0 2 2 6 5 date >> date.txt # 每年6月2号或者星期5的2点
* /5 * * * * date >> date.txt # 每隔5分钟执行一次
0 2 1,4,6 * * date >> date.txt # 每月1号,4号,6号的2点
0 2 5-9 * * date >> date.txt # 每月5-9号的2点
* * * * * date >> date.txt # 每分钟
0 * * * * date >> date.txt # 每整点
* * 2 * * date >> date.txt # 每月2号的每分钟
其中,第一个字段表示分钟(0-59),第二个字段表示小时(0-23),第三个字段表示天(1-31),第四个字段表示月份(1-12),第五个字段表示星期(0-7)。第六个字段是要执行的命令或脚本。
例如,要每天上午10点重启系统,可以配置如下:
0 10 * * * reboot
查看任务存放位置
/var/spool/cron/root
[root@localhost ~]# cat /var/spool/cron/root
* * * * * date >> file.txt
示例
这里列举几个常见的cron任务的示例:
每天凌晨3点备份文件:
0 3 * * * /path/to/backup.sh
每周一上午8点清理临时文件:
0 8 * * 1 /path/to/cleanup.sh
每隔10分钟检查服务器状态:
*/10 * * * * /path/to/check_status.sh
cron系统任务
- 临时文件的清理
/tmp
/var/tmp
- 系统信息的采集
sar
- 日志的轮转(切割)
lgrotate
- 通常不是由用户定义
- 文件的位置
[root@localhost ~]# vim /etc/crontab # 默认没有定义任何计划任务
[root@localhost ~]# ls /etc/cron.d # 定义的计划任务每个小时会执行
0hourly sysstat
[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
[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 目录内的文件是否被执行,如果一个月内没有被执行,那就执行
日志管理
Linux系统和许多程序会产生各种错误信息、告警信息和其他的提示信息,这些各种信息都应该记录到日志文件中。Linux系统日志对管理员来说,是了解系统运行的主要途径,因此需要对Linux日志系统有详细的了解。
常见的日志文件
日志文件 | 解释 |
---|---|
/var/log/messages | 系统主日志文件 |
/var/log/secure | 记录认证、安全的日志 |
/var/log/maillog | 跟邮件postfix相关 |
/var/log/cron | crond、at进程产生的日志 |
/var/log/dmesg | 记录系统启动时加载的硬件相关信息日志 |
/var/log/yum.log | yum的日志 |
/var/log/mysqld.log | MySQL日志 |
var/log/xferlog | 和访问FTP服务器相关 |
/var/log/boot.log | 系统启动过程日志记录存放 |
/var/log/wtmp | 当前登录的用户(可以直接在命令行输入w查看) |
/var/log/lastlog | 所有用户的登录情况(可以直接在命令行输入lastlog查看) |
查看日志
有多种方法可以查看日志,可以通过cat、tail等命令来查看
但是往往日志文件中内容都是非常多的,所以对于初学者通过cat查看不是很直观。这个时候我们可以配合一些其他过滤工具来过滤日志里面的内容。如:grep,awk等等。
示例一:查看message日志中关于ens33网卡的信息
[root@localhost ~]# cat /var/log/messages | grep ens33
# 通过grep来过滤出跟ens33相关的内容
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9969] dhcp4 (ens33): address 192.168.88.136
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): plen 24 (255.255.255.0)
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): gateway 192.168.88.2
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): lease time 5185800
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): nameserver '192.168.88.2'
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): domain name 'localdomain'
May 30 09:55:47 localhost NetworkManager[6310]: <info> [1717034147.9970] dhcp4 (ens33): state changed unknown -> bound
示例二:统计远程登录信息
[root@localhost ~]# cat /var/log/secure-20240530 | grep Accepted
Apr 27 10:49:14 localhost sshd[16512]: Accepted password for root from 192.168.88.1 port 56801 ssh2
Apr 27 10:49:14 localhost sshd[16516]: Accepted password for root from 192.168.88.1 port 56818 ssh2
May 30 09:33:21 localhost sshd[7319]: Accepted password for root from 192.168.88.1 port 15675 ssh2
May 30 09:33:21 localhost sshd[7323]: Accepted password for root from 192.168.88.1 port 15676 ssh2
示例三:查看用户与用户组相关的信息
[root@localhost ~]# cat /var/log/secure | grep useradd
May 30 11:09:15 localhost useradd[7762]: new group: name=user1, GID=1001
May 30 11:09:15 localhost useradd[7762]: new user: name=user1, UID=1001, GID=1001, home=/home/user1, shell=/bin/bash
May 30 11:09:18 localhost useradd[7767]: new group: name=user2, GID=1002
May 30 11:09:18 localhost useradd[7767]: new user: name=user2, UID=1002, GID=1002, home=/home/user2, shell=/bin/bash
[root@localhost ~]# cat /var/log/secure | grep groupadd
May 30 11:09:29 localhost groupadd[7772]: group added to /etc/group: name=IT, GID=1003
May 30 11:09:29 localhost groupadd[7772]: group added to /etc/gshadow: name=IT
May 30 11:09:29 localhost groupadd[7772]: new group: name=IT, GID=1003
示例四:查看计划任务cron相关
[root@localhost ~]# cat /var/log/cron
May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7516]: finished logrotate
May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7504]: starting man-db.cron
May 30 10:15:01 localhost run-parts(/etc/cron.daily)[7715]: finished man-db.cron
May 30 10:15:01 localhost anacron[7492]: Job `cron.daily' terminated
May 30 10:35:01 localhost anacron[7492]: Job `cron.weekly' started
May 30 10:35:01 localhost anacron[7492]: Job `cron.weekly' terminated
May 30 10:55:01 localhost anacron[7492]: Job `cron.monthly' started
May 30 10:55:01 localhost anacron[7492]: Job `cron.monthly' terminated
May 30 10:55:01 localhost anacron[7492]: Normal exit (3 jobs run)
May 30 11:01:01 localhost CROND[7741]: (root) CMD (run-parts /etc/cron.hourly)
May 30 11:01:01 localhost run-parts(/etc/cron.hourly)[7741]: starting 0anacron
May 30 11:01:01 localhost run-parts(/etc/cron.hourly)[7750]: finished 0anacron
日志系统-rsyslogd
处理日志的进程
rsyslogd
:绝大部分日志记录,和系统操作有关,安全,认证sshd,su
,计划任务at,cron
httpd/nginx/mysql
等等应用可以以自己的方式记录日志
[root@localhost ~]# ps aux |grep rsyslogd
root 6808 0.0 0.2 216408 5016 ? Ssl 09:32 0:00 /usr/sbin/rsyslogd -n
root 7724 0.0 0.0 112724 988 pts/0 S+ 10:39 0:00 grep --color=auto rsyslogd
日志可以存放在本地
日志可以存放在远程服务器
配置文件
[root@localhost ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog # 日志轮转(切割)相关
/etc/rsyslog.conf # rsyslogd的主配置文件
/etc/sysconfig/rsyslog # rsyslogd相关文件
[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)
序号 | Facility | 解释 |
---|---|---|
0 | kern (kernel) | Linux内核产生的信息,大部分是硬件检测和内核功能的启用 |
1 | user | 用户层级产生的信息,例如后边介绍的通过logger 产生的日志信息 |
2 | 所有邮件收发的相关信息 | |
3 | daemon | 系统服务产生的信息 |
4 | auth | 与认证、授权相关的信息,如login 、ssh 、su 等产生的信息 |
5 | syslog | syslogd 服务产生的信息 |
6 | lpr | 打印相关的信息 |
7 | news | 新闻群组相关的信息 |
8 | uucp | Unix to Unix Copy Protocol 早期Unix系统间的数据交换协议 |
9 | cron | 周期性计划任务程序,如cron 、at 等产生的信息 |
10 | authpriv | 与auth类似,但记录的多为帐号相关的信息,如pam模块的调用等 |
16~23 | local0~local7 | 保留给本地用户使用的日志类型,通常与终端交互相关。 |
日志级别
级别(日志重要级别) | 解释 |
---|---|
LOG_EMERG | 紧急,致命,服务无法继续运行,如配置文件丢失 |
LOG_ALERT | 报警,需要立即处理,如磁盘空间使用95% |
LOG_CRIT | 致命行为 |
LOG_ERR(error) | 错误行为 |
LOG_WARNING | 警告信息 |
LOG_NOTICE | 普通 |
LOG_INFO | 标准信息 |
LOG_DEBUG | 调试信息,排错才开,一般不建议使用 |
案例:远程管理日志
环境准备:两台服务器,其中server1模仿生产服务器,server2做为日志服务器。
实验要求:server1和server2可以通信(建议两边的虚拟网卡都调整成NAT模式)
实验目的:通过配置rsyslog,使得server1上关于ssh连接的日志发送到server2日志服务器上保存,在server2上可以查看到server1上的ssh日志
注意关闭server1和server2上的firewalld!!
systemctl stop firewalld
server1上配置:
- 编辑
/etc/rsyslog.conf
文件
# 在最下面添加如下字段
[root@localhost ~]# vim /etc/rsyslog.conf
:msg,contains,"sshd" @192.168.88.138:514
#=====字典解释=====
- msg 要发送的消息
- contains,"sshd" 过滤器,过滤所有跟sshd有关的日志
- @192.168.88.138:514 要发送到日志服务器的地址,其中@表示UDP,@@表示TCP
- 重启rsyslog服务
[root@localhost ~]# systemctl restart rsyslog
server2上配置:
修改配置文件
[root@localhost ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp # 把前面的注释删除 加载imudp模块,启用对UDP网络接口的支持
$UDPServerRun 514 # 把前面的注释删除 用于通信的端口
$ModLoad imtcp # tcp
$InputTCPServerRun 514
:msg,contains,"sshd" /var/log/remote_ssh.log # 任意位置添加规则,
# 重启rsyslog服务
[root@localhost ~]# systemctl restart rsyslog
测试:
通过MobaXterm远程连接server1
通过tail -f /var/log/remote_ssh.log
来实时检测是否又日志记录发过来
日志文件归档
如果我们不管理系统产生的上述各种日志文件,那么久而久之日志就会变成“屎山”。日志文件及内容越堆越多,不仅难以查阅,还会因为单一文件过大而影响新的内容写入的效率
logrotate
就是一个不错的日志处理程序,准确的说是对日志进行“归档”之类的工作
logrotate(日志轮转)
- 如果没有日志轮转,日志文件会越来越大
- 将丢弃系统中最旧的日志文件,以节省空间
- 事实上
logrotate
是挂在cron
配置目录cron.daily
下面的,所以会被cron
每天执行一次:
[root@localhost ~]# ll /etc/cron.daily/
-rwx------. 1 root root 219 10月 31 2018 logrotate
-rwxr-xr-x. 1 root root 618 10月 30 2018 man-db.cron
# 查看logrotate内容
[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中来
- logrotate主配置文件
[root@localhost ~]# vim /etc/logrotate.conf
weekly # 多久会执行一次“轮转”,这里设置的是每周一次
rotate 4 # 轮转后会保留几个历史日志文件,这里是4,也就是说轮转后会删除编号为5的历史日志
create # 轮转后创建新的空白日志
dateext # 使用日期而非数字编号作为历史日志的标识进行轮转
include /etc/logrotate.d # 加载/etc/logrotate.d目录下的配置文件
/var/log/wtmp { # 对/var/log/wtmp日志的特殊设置
monthly # 每月进行一次轮转
create 0664 root utmp # 创建的新的空白日志权限为0664,用户为root,用户组为utmp
minsize 1M # 原始日志文件超过1M大小才进行轮转
rotate 1 # 仅保留1个历史日志文件
}
/var/log/btmp { # 对/var/log/btmp日志的特殊设置
missingok # 日志轮转期间任何错误都会被忽略
monthly # 每月进行一次轮转
create 0600 root utmp # 创建的新日志文件权限为0600,用户为root,用户组为utmp
rotate 1 # 仅保留1个历史日志文件
}
- 子配置文件
[root@localhost ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}