Files
Cloud-book/Linux基础/计划任务与日志.md
2025-08-27 17:10:05 +08:00

529 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 计划任务
- 计划任务主要是做一些周期性的任务,可以让某个任务按照我们的预期的时间或计划去执行。
## 单次调度执行at
安装at软件包
`yum install -y at`
启动at服务
```bash
[root@localhost ~]# systemctl start atd
[root@localhost ~]# systemctl enable atd # 开机自启动
```
### 语法结构
`at [options] time`
#### 选项:
- -f指定包含具体指令的任务文件
- -q指定新任务的队列名称
- -l显示待执行任务的列表
- -d删除指定的待执行任务
- -c根据序号查看具体任务的内容
或者也可以使用一下命令查看和删除
`atq`:查看待执行的任务
`atrm`:通过序号删除任务
#### timespec
```bash
at now +5min # 从现在开始5分钟后
at teatime tomorrow # 明天的下午1600
at noon +4 days # 4天后的中午
at 11:20 AM # 早上1120
.....
.....
# 对于at任务的时间写法有很多不需要记忆用到的时候查询一下就行
```
**示例一:**5分钟后创建一个文件
```bash
[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
```
**示例二:**通过文件指定任务
```bash
[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服务有没有启动**
```bash
[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命令的基本语法如下
```text
crontab [-l | -r | -e | -n | -m]
```
#### 选项:
- `-l`:列出当前用户的定时任务。
- `-r`:删除当前用户的定时任务。
- `-e`:编辑当前用户的定时任务。
- `-n`:检查定时任务是否可用。
- `-m`:发送类似于电子邮件的消息,用于通知定时任务执行的结果。
```bash
[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编辑器
```bash
crontab -e
```
### 配置cron任务的格式
cron任务的格式如下
```bash
分 时 日 月 星期 命令
* 表示任何数字都符合
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点重启系统可以配置如下
```bash
0 10 * * * reboot
```
在线crontab测试网站 <https://crontab.guru/#0_*_*_*_*>
### 查看任务存放位置
`/var/spool/cron/root`
```bash
[root@localhost ~]# cat /var/spool/cron/root
* * * * * date >> file.txt
```
### 示例
这里列举几个常见的cron任务的示例
1. 每天凌晨3点备份文件
```text
0 3 * * * /path/to/backup.sh
```
2. 每周一上午8点清理临时文件
```text
0 8 * * 1 /path/to/cleanup.sh
```
3. 每隔10分钟检查服务器状态
```text
*/10 * * * * /path/to/check_status.sh
```
## cron系统任务
- 临时文件的清理`/tmp` `/var/tmp`
- 系统信息的采集 `sar`
- 日志的轮转(切割) `lgrotate`
- 通常不是由用户定义
- 文件的位置
```bash
[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`
```bash
[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查看不是很直观。这个时候我们可以配合一些其他过滤工具来过滤日志里面的内容。如grepawk等等。
### 示例一查看message日志中关于ens160网卡的信息
```bash
[root@localhost ~]# cat /var/log/messages | grep ens160
# 通过grep来过滤出跟ens160相关的内容
[root@localhost ~]# cat /var/log/messages | grep ens160
Nov 9 11:13:20 localhost kernel: vmxnet3 0000:03:00.0 ens160: renamed from eth0
Nov 9 11:13:24 localhost NetworkManager[785]: <info> [1731122004.5476] manager: (ens160): new Ethernet device (/org/freedesktop/NetworkManager/Devices/2)
Nov 9 11:13:24 localhost NetworkManager[785]: <info> [1731122004.5482] device (ens160): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external')
Nov 9 11:13:24 localhost kernel: vmxnet3 0000:03:00.0 ens160: intr type 3, mode 0, 5 vectors allocated
Nov 9 11:13:24 localhost kernel: vmxnet3 0000:03:00.0 ens160: NIC Link is Up 10000 Mbps
Nov 9 11:13:24 localhost NetworkManager[785]: <info> [1731122004.5604] device (ens160): carrier: link connected
```
### 示例二:统计远程登录信息
```bash
[root@localhost ~]# cat /var/log/secure | grep Accepted
Nov 9 14:14:19 localhost sshd[4953]: Accepted password for root from 192.168.88.1 port 57324 ssh2
Nov 28 11:44:38 localhost sshd[1523]: Accepted password for root from 192.168.88.1 port 1665 ssh2
Nov 28 11:44:38 localhost sshd[1525]: Accepted password for root from 192.168.88.1 port 1666 ssh2
Nov 28 13:39:50 localhost sshd[1514]: Accepted password for root from 192.168.88.1 port 3682 ssh2
```
### 示例三:查看用户与用户组相关的信息
```bash
[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相关
```bash
[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`等等应用可以以自己的方式记录日志
```bash
[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
```
日志可以存放在本地
日志可以存放在远程服务器
### 配置文件
```bash
[root@localhost ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog # 日志轮转(切割)相关
/etc/rsyslog.conf # rsyslogd的主配置文件
/etc/sysconfig/rsyslog # rsyslogd相关文件
```
```bash
[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 | 用户层级产生的信息 |
| 2 | mail | 所有邮件收发的相关信息 |
| 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上配置**
1. 编辑`/etc/rsyslog.conf`文件
```bash
# 在最下面添加如下字段
[root@localhost ~]# vim /etc/rsyslog.conf
:msg,contains,"sshd" @192.168.88.20:514
#=====字典解释=====
- msg 要发送的消息
- contains,"sshd" 过滤器过滤所有跟sshd有关的日志
- @192.168.88.20:514 要发送到日志服务器的地址,其中@表示UDP@@表示TCP
```
2. 重启rsyslog服务
```bash
[root@localhost ~]# systemctl restart rsyslog
```
**server2上配置**
修改配置文件
```bash
[root@localhost ~]# vim /etc/rsyslog.conf
# Provides UDP syslog reception
# 在配置文件中下入下面几行
# 加载imudp模块启用对UDP网络接口的支持
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$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`每天执行一次:
```bash
[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主配置文件
```bash
[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个历史日志文件
}
```
- 子配置文件
```bash
[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
}
```