Linux定时任务与日志管理实战指南:自动化运维的核心技能
Orion K Lv6

Linux定时任务与日志管理实战指南:自动化运维的核心技能

在Linux系统运维中,定时任务和日志管理是实现自动化运维的重要基础。本文将深入介绍Linux定时任务的配置和管理,以及日志系统的管理和分析技巧,帮助运维人员提升自动化运维能力。

一、Linux定时任务基础

1.1 定时任务概述

Linux系统提供了多种定时任务解决方案:

工具 适用场景 特点 配置方式
crontab 周期性任务 功能强大,使用广泛 crontab -e
at 一次性任务 简单易用 at 时间
systemd timer 现代化定时器 与systemd集成 .timer文件
anacron 非连续运行系统 适合桌面系统 /etc/anacrontab

1.2 cron服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看cron服务状态
systemctl status crond # CentOS/RHEL
systemctl status cron # Ubuntu/Debian

# 启动/停止/重启cron服务
systemctl start crond
systemctl stop crond
systemctl restart crond
systemctl reload crond

# 设置开机自启
systemctl enable crond

# 查看cron服务日志
journalctl -u crond
tail -f /var/log/cron

1.3 crontab配置文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看系统crontab配置
cat /etc/crontab

# 典型的/etc/crontab内容
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 分 时 日 月 周 用户 命令
# m h dom mon dow user command
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

crontab时间格式详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 字段说明
# ┌───────────── 分钟 (0-59)
# │ ┌───────────── 小时 (0-23)
# │ │ ┌───────────── 日 (1-31)
# │ │ │ ┌───────────── 月 (1-12)
# │ │ │ │ ┌───────────── 周 (0-6,0=周日)
# │ │ │ │ │
# * * * * * 命令

# 特殊字符说明
* # 匹配所有值
, # 分隔多个值
- # 指定范围
/ # 指定间隔
? # 不指定值(仅在日和周字段使用)
L # 最后(月的最后一天或周的最后一天)
W # 工作日
# # 第几个(如3#2表示第二个周三)

二、crontab实战应用

2.1 基本crontab操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 编辑当前用户的crontab
crontab -e

# 查看当前用户的crontab
crontab -l

# 删除当前用户的crontab
crontab -r

# 删除前确认
crontab -i -r

# 管理其他用户的crontab(需要root权限)
crontab -u username -e
crontab -u username -l

# 从文件导入crontab
crontab filename

2.2 常用定时任务示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 每分钟执行
* * * * * /path/to/script.sh

# 每5分钟执行
*/5 * * * * /path/to/script.sh

# 每小时的第30分钟执行
30 * * * * /path/to/script.sh

# 每天凌晨2点执行
0 2 * * * /path/to/script.sh

# 每周一凌晨3点执行
0 3 * * 1 /path/to/script.sh

# 每月1号凌晨4点执行
0 4 1 * * /path/to/script.sh

# 工作日每天上午9点执行
0 9 * * 1-5 /path/to/script.sh

# 每天上午8点到下午6点,每2小时执行一次
0 8-18/2 * * * /path/to/script.sh

# 每年1月1日凌晨执行
0 0 1 1 * /path/to/script.sh

2.3 高级crontab技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 使用环境变量
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com

# 设置任务执行目录
0 2 * * * cd /var/backups && ./backup.sh

# 重定向输出
0 2 * * * /path/to/script.sh > /var/log/backup.log 2>&1

# 静默执行(不发送邮件)
0 2 * * * /path/to/script.sh >/dev/null 2>&1

# 只记录错误
0 2 * * * /path/to/script.sh >/dev/null

# 使用锁文件防止重复执行
0 2 * * * flock -n /tmp/backup.lock /path/to/backup.sh

# 条件执行
0 2 * * * [ -f /tmp/enable_backup ] && /path/to/backup.sh

2.4 crontab最佳实践

1. 标准化脚本模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
# 脚本名称: backup_database.sh
# 作者: Admin
# 创建时间: 2024-01-20
# 描述: 数据库备份脚本
# 执行频率: 每天凌晨2点

# 设置环境变量
export PATH=/usr/local/bin:/usr/bin:/bin
export LANG=en_US.UTF-8

# 脚本配置
SCRIPT_NAME=$(basename $0)
LOG_DIR="/var/log/cron"
LOG_FILE="$LOG_DIR/${SCRIPT_NAME%.*}.log"
LOCK_FILE="/tmp/${SCRIPT_NAME%.*}.lock"

# 创建日志目录
[ ! -d "$LOG_DIR" ] && mkdir -p "$LOG_DIR"

# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 错误处理函数
error_exit() {
log "ERROR: $1"
rm -f "$LOCK_FILE"
exit 1
}

# 检查锁文件
if [ -f "$LOCK_FILE" ]; then
log "Script is already running. Exiting."
exit 1
fi

# 创建锁文件
echo $$ > "$LOCK_FILE"

# 清理函数
cleanup() {
rm -f "$LOCK_FILE"
log "Script completed."
}

# 设置信号处理
trap cleanup EXIT
trap 'error_exit "Script interrupted"' INT TERM

# 主要逻辑
log "Starting database backup..."

# 数据库备份逻辑
mysqldump -u backup_user -p'password' --all-databases > "/backup/mysql_$(date +%Y%m%d_%H%M%S).sql" || error_exit "Database backup failed"

log "Database backup completed successfully."

2. 定时任务配置规范:

1
2
3
4
5
6
7
8
9
10
11
12
# 在crontab中添加注释
# 数据库备份 - 每天凌晨2点执行
# 添加人: admin, 添加时间: 2024-01-20
0 2 * * * /usr/local/scripts/backup_database.sh

# 日志清理 - 每周日凌晨3点执行
# 清理7天前的日志文件
0 3 * * 0 /usr/local/scripts/cleanup_logs.sh

# 系统监控 - 每5分钟执行
# 监控系统资源使用情况
*/5 * * * * /usr/local/scripts/system_monitor.sh

三、at命令一次性任务

3.1 at命令基础

1
2
3
4
5
6
7
8
9
10
# 安装at服务
sudo yum install at # CentOS/RHEL
sudo apt install at # Ubuntu/Debian

# 启动at服务
sudo systemctl start atd
sudo systemctl enable atd

# 查看at服务状态
sudo systemctl status atd

3.2 at命令使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 在指定时间执行命令
at 15:30
at> echo "Hello World" > /tmp/hello.txt
at> <Ctrl+D>

# 指定日期和时间
at 15:30 2024-01-25
at 3:30pm Jan 25
at now + 5 minutes
at now + 1 hour
at now + 1 day
at now + 1 week

# 查看待执行的任务
atq
at -l

# 查看任务详情
at -c job_number

# 删除任务
atrm job_number
at -d job_number

# 从文件读取命令
at now + 1 hour -f /path/to/commands.txt

3.3 at命令实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 定时重启服务
echo "systemctl restart nginx" | at now + 10 minutes

# 定时发送邮件
echo "echo 'System maintenance completed' | mail -s 'Maintenance' admin@example.com" | at 18:00

# 定时备份
echo "/usr/local/scripts/backup.sh" | at 02:00 tomorrow

# 批量任务
cat << EOF | at now + 5 minutes
/usr/local/scripts/stop_services.sh
sleep 60
/usr/local/scripts/start_services.sh
EOF

四、systemd定时器

4.1 systemd timer基础

1
2
3
4
5
6
7
8
9
10
11
# 查看所有定时器
systemctl list-timers
systemctl list-timers --all

# 查看特定定时器状态
systemctl status timer_name.timer

# 启动/停止定时器
systemctl start timer_name.timer
systemctl stop timer_name.timer
systemctl enable timer_name.timer

4.2 创建systemd定时器

1. 创建服务文件:

1
2
3
4
5
6
7
8
9
10
11
# /etc/systemd/system/backup.service
[Unit]
Description=Database Backup Service
After=network.target

[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/scripts/backup.sh
StandardOutput=journal
StandardError=journal

2. 创建定时器文件:

1
2
3
4
5
6
7
8
9
10
11
12
# /etc/systemd/system/backup.timer
[Unit]
Description=Run backup service daily
Requires=backup.service

[Timer]
OnCalendar=daily
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

3. 启用定时器:

1
2
3
4
5
6
7
8
9
10
# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用并启动定时器
sudo systemctl enable backup.timer
sudo systemctl start backup.timer

# 查看定时器状态
sudo systemctl status backup.timer
sudo systemctl list-timers backup.timer

4.3 systemd定时器时间格式

1
2
3
4
5
6
7
8
9
10
11
12
13
# OnCalendar时间格式示例
OnCalendar=*-*-* 02:00:00 # 每天凌晨2点
OnCalendar=Mon *-*-* 02:00:00 # 每周一凌晨2点
OnCalendar=*-*-01 02:00:00 # 每月1号凌晨2点
OnCalendar=*-01-01 02:00:00 # 每年1月1号凌晨2点
OnCalendar=*:0/15 # 每15分钟
OnCalendar=hourly # 每小时
OnCalendar=daily # 每天
OnCalendar=weekly # 每周
OnCalendar=monthly # 每月

# 测试时间格式
systemd-analyze calendar "Mon *-*-* 02:00:00"

五、日志管理基础

5.1 Linux日志系统概述

传统日志系统:

  • syslog:传统的系统日志服务
  • rsyslog:增强版syslog
  • syslog-ng:另一个增强版syslog

现代日志系统:

  • systemd-journald:systemd的日志服务
  • 集中式日志:ELK Stack、Fluentd等

5.2 主要日志文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 系统日志文件位置
/var/log/messages # 系统主日志(CentOS/RHEL)
/var/log/syslog # 系统主日志(Ubuntu/Debian)
/var/log/secure # 安全相关日志
/var/log/auth.log # 认证日志(Ubuntu/Debian)
/var/log/cron # cron任务日志
/var/log/maillog # 邮件系统日志
/var/log/boot.log # 系统启动日志
/var/log/dmesg # 内核消息
/var/log/kern.log # 内核日志

# 应用日志
/var/log/httpd/ # Apache日志
/var/log/nginx/ # Nginx日志
/var/log/mysql/ # MySQL日志
/var/log/postgresql/ # PostgreSQL日志

5.3 rsyslog配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看rsyslog配置
cat /etc/rsyslog.conf

# 基本配置格式
# facility.priority action
# 设施.优先级 动作

# 示例配置
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*

# 重启rsyslog服务
sudo systemctl restart rsyslog

日志级别说明:

1
2
3
4
5
6
7
8
emerg    # 0 - 紧急情况
alert # 1 - 需要立即处理
crit # 2 - 严重错误
err # 3 - 一般错误
warning # 4 - 警告信息
notice # 5 - 注意信息
info # 6 - 一般信息
debug # 7 - 调试信息

六、日志查看和分析

6.1 基本日志查看命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看日志文件
cat /var/log/messages
less /var/log/messages
more /var/log/messages

# 实时查看日志
tail -f /var/log/messages
tail -f /var/log/messages | grep ERROR

# 查看最后N行
tail -n 100 /var/log/messages
head -n 50 /var/log/messages

# 按时间范围查看
sed -n '/Jan 20 10:00/,/Jan 20 11:00/p' /var/log/messages

# 使用grep过滤
grep "ERROR" /var/log/messages
grep -i "failed" /var/log/messages
grep -v "INFO" /var/log/messages
grep -A 5 -B 5 "ERROR" /var/log/messages

6.2 journalctl命令详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 查看所有日志
journalctl

# 实时查看日志
journalctl -f

# 查看特定服务日志
journalctl -u nginx
journalctl -u nginx -f

# 按时间范围查看
journalctl --since "2024-01-20 10:00:00"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl --until "2024-01-20 18:00:00"

# 按优先级过滤
journalctl -p err
journalctl -p warning

# 查看内核消息
journalctl -k

# 查看启动日志
journalctl -b
journalctl -b -1 # 上次启动

# 输出格式
journalctl -o json
journalctl -o json-pretty
journalctl -o cat

# 查看磁盘使用
journalctl --disk-usage

# 清理日志
journalctl --vacuum-time=7d
journalctl --vacuum-size=100M

6.3 日志分析脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash
# 日志分析脚本
# 文件名: log_analysis.sh

LOG_FILE="/var/log/messages"
REPORT_FILE="/tmp/log_analysis_$(date +%Y%m%d).txt"
DATE=$(date '+%Y-%m-%d')

echo "=== 日志分析报告 - $DATE ===" > $REPORT_FILE
echo "" >> $REPORT_FILE

# 统计今日日志条数
echo "今日日志总数:" >> $REPORT_FILE
grep "$DATE" $LOG_FILE | wc -l >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 统计错误日志
echo "错误日志统计:" >> $REPORT_FILE
grep "$DATE" $LOG_FILE | grep -i error | wc -l >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 统计警告日志
echo "警告日志统计:" >> $REPORT_FILE
grep "$DATE" $LOG_FILE | grep -i warning | wc -l >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 最频繁的错误
echo "最频繁的错误(Top 10):" >> $REPORT_FILE
grep "$DATE" $LOG_FILE | grep -i error | awk '{for(i=6;i<=NF;i++) printf "%s ", $i; print ""}' | sort | uniq -c | sort -nr | head -10 >> $REPORT_FILE
echo "" >> $REPORT_FILE

# SSH登录统计
echo "SSH登录统计:" >> $REPORT_FILE
grep "$DATE" /var/log/secure | grep "Accepted" | wc -l >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 失败的SSH登录
echo "失败的SSH登录:" >> $REPORT_FILE
grep "$DATE" /var/log/secure | grep "Failed" | wc -l >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 磁盘空间检查
echo "磁盘空间使用:" >> $REPORT_FILE
df -h >> $REPORT_FILE
echo "" >> $REPORT_FILE

# 发送报告
if [ -s $REPORT_FILE ]; then
mail -s "日志分析报告 - $DATE" admin@example.com < $REPORT_FILE
fi

echo "日志分析完成,报告已生成: $REPORT_FILE"

七、日志轮转管理

7.1 logrotate配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看logrotate配置
cat /etc/logrotate.conf

# 基本配置示例
/var/log/myapp/*.log {
daily # 每天轮转
missingok # 文件不存在不报错
rotate 52 # 保留52个文件
compress # 压缩旧文件
delaycompress # 延迟压缩
notifempty # 空文件不轮转
create 644 root root # 创建新文件的权限
postrotate # 轮转后执行的命令
systemctl reload nginx
endscript
}

# 测试logrotate配置
sudo logrotate -d /etc/logrotate.conf
sudo logrotate -f /etc/logrotate.d/myapp

7.2 自定义日志轮转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 创建应用日志轮转配置
sudo nano /etc/logrotate.d/myapp

/var/log/myapp/*.log {
weekly
missingok
rotate 12
compress
delaycompress
notifempty
create 644 myapp myapp
sharedscripts
postrotate
/bin/kill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}

# Nginx日志轮转配置
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 nginx nginx
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
}

7.3 日志清理脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
# 日志清理脚本
# 文件名: log_cleanup.sh

# 配置参数
LOG_DIRS=(
"/var/log/nginx"
"/var/log/apache2"
"/var/log/myapp"
"/tmp"
)

DAYS_TO_KEEP=7
SIZE_LIMIT="100M"

# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

log "开始清理日志文件..."

# 按时间清理
for dir in "${LOG_DIRS[@]}"; do
if [ -d "$dir" ]; then
log "清理目录: $dir"
find "$dir" -name "*.log" -type f -mtime +$DAYS_TO_KEEP -delete
find "$dir" -name "*.log.*" -type f -mtime +$DAYS_TO_KEEP -delete
find "$dir" -name "*.gz" -type f -mtime +$DAYS_TO_KEEP -delete
fi
done

# 清理大文件
log "清理大于${SIZE_LIMIT}的日志文件..."
find /var/log -name "*.log" -type f -size +$SIZE_LIMIT -exec truncate -s 0 {} \;

# 清理临时文件
log "清理临时文件..."
find /tmp -name "*.tmp" -type f -mtime +1 -delete
find /tmp -name "*.log" -type f -mtime +1 -delete

# 清理journal日志
log "清理systemd journal日志..."
journalctl --vacuum-time=7d
journalctl --vacuum-size=100M

log "日志清理完成"

# 生成清理报告
echo "磁盘使用情况:" > /tmp/cleanup_report.txt
df -h >> /tmp/cleanup_report.txt
echo "" >> /tmp/cleanup_report.txt
echo "日志目录大小:" >> /tmp/cleanup_report.txt
du -sh /var/log/* >> /tmp/cleanup_report.txt

# 发送报告
mail -s "日志清理报告 - $(date +%Y-%m-%d)" admin@example.com < /tmp/cleanup_report.txt

八、日志监控和告警

8.1 实时日志监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
# 实时日志监控脚本
# 文件名: log_monitor.sh

LOG_FILE="/var/log/messages"
ALERT_EMAIL="admin@example.com"
ERROR_THRESHOLD=10
WARNING_THRESHOLD=20

# 监控关键词
ERROR_KEYWORDS=("ERROR" "CRITICAL" "FATAL" "PANIC")
WARNING_KEYWORDS=("WARNING" "WARN")

# 计数器
ERROR_COUNT=0
WARNING_COUNT=0

# 监控函数
monitor_logs() {
tail -f "$LOG_FILE" | while read line; do
# 检查错误关键词
for keyword in "${ERROR_KEYWORDS[@]}"; do
if echo "$line" | grep -qi "$keyword"; then
((ERROR_COUNT++))
echo "[$(date)] ERROR detected: $line"

if [ $ERROR_COUNT -ge $ERROR_THRESHOLD ]; then
echo "ERROR threshold reached: $ERROR_COUNT" | \
mail -s "ALERT: High error rate" "$ALERT_EMAIL"
ERROR_COUNT=0
fi
break
fi
done

# 检查警告关键词
for keyword in "${WARNING_KEYWORDS[@]}"; do
if echo "$line" | grep -qi "$keyword"; then
((WARNING_COUNT++))
echo "[$(date)] WARNING detected: $line"

if [ $WARNING_COUNT -ge $WARNING_THRESHOLD ]; then
echo "WARNING threshold reached: $WARNING_COUNT" | \
mail -s "ALERT: High warning rate" "$ALERT_EMAIL"
WARNING_COUNT=0
fi
break
fi
done
done
}

# 启动监控
echo "开始监控日志文件: $LOG_FILE"
monitor_logs

8.2 日志异常检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/bin/bash
# 日志异常检测脚本
# 文件名: log_anomaly_detection.sh

LOG_FILE="/var/log/messages"
BASELINE_FILE="/tmp/log_baseline.txt"
ANOMALY_REPORT="/tmp/anomaly_report.txt"
DATE=$(date '+%Y-%m-%d')

# 生成基线数据(正常情况下的日志模式)
generate_baseline() {
echo "生成基线数据..."
# 分析过去7天的日志模式
for i in {1..7}; do
past_date=$(date -d "$i days ago" '+%Y-%m-%d')
grep "$past_date" "$LOG_FILE" | \
awk '{print $5}' | sort | uniq -c | sort -nr
done > "$BASELINE_FILE"
}

# 检测异常
detect_anomalies() {
echo "检测今日异常..."

# 今日日志模式
grep "$DATE" "$LOG_FILE" | \
awk '{print $5}' | sort | uniq -c | sort -nr > /tmp/today_pattern.txt

# 比较基线和今日模式
echo "=== 日志异常检测报告 - $DATE ===" > "$ANOMALY_REPORT"
echo "" >> "$ANOMALY_REPORT"

# 检查新出现的错误模式
echo "新出现的日志模式:" >> "$ANOMALY_REPORT"
comm -13 <(awk '{print $2}' "$BASELINE_FILE" | sort) \
<(awk '{print $2}' /tmp/today_pattern.txt | sort) >> "$ANOMALY_REPORT"
echo "" >> "$ANOMALY_REPORT"

# 检查频率异常增加的模式
echo "频率异常增加的模式:" >> "$ANOMALY_REPORT"
while read count pattern; do
baseline_count=$(grep "$pattern" "$BASELINE_FILE" | awk '{sum+=$1} END {print sum/7}' || echo 0)
if (( $(echo "$count > $baseline_count * 2" | bc -l) )); then
echo "$pattern: 今日$count次, 平均${baseline_count}次" >> "$ANOMALY_REPORT"
fi
done < /tmp/today_pattern.txt

# 发送报告
if [ -s "$ANOMALY_REPORT" ]; then
mail -s "日志异常检测报告 - $DATE" admin@example.com < "$ANOMALY_REPORT"
fi
}

# 主程序
if [ ! -f "$BASELINE_FILE" ] || [ $(find "$BASELINE_FILE" -mtime +7) ]; then
generate_baseline
fi

detect_anomalies

九、集中化日志管理

9.1 rsyslog远程日志

服务端配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 编辑/etc/rsyslog.conf
# 启用UDP接收
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 0.0.0.0

# 启用TCP接收
$ModLoad imtcp
$InputTCPServerRun 514

# 远程日志存储
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop

# 重启rsyslog
sudo systemctl restart rsyslog

客户端配置:

1
2
3
4
5
6
7
8
9
10
# 编辑/etc/rsyslog.conf
# 发送所有日志到远程服务器
*.* @@log-server:514

# 发送特定日志
mail.* @@log-server:514
auth.* @@log-server:514

# 重启rsyslog
sudo systemctl restart rsyslog

9.2 使用ELK Stack

Filebeat配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/*.log
- /var/log/messages
- /var/log/secure
fields:
logtype: system
environment: production

- type: log
enabled: true
paths:
- /var/log/nginx/*.log
fields:
logtype: nginx
environment: production

output.elasticsearch:
hosts: ["elasticsearch:9200"]
index: "filebeat-%{+yyyy.MM.dd}"

logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0644

十、定时任务和日志管理最佳实践

10.1 定时任务最佳实践

  1. 脚本规范化

    • 使用绝对路径
    • 设置适当的环境变量
    • 添加详细注释
    • 实现错误处理和日志记录
  2. 安全考虑

    • 使用专用用户执行任务
    • 限制脚本权限
    • 避免在脚本中硬编码密码
    • 定期审查定时任务
  3. 监控和告警

    • 监控任务执行状态
    • 设置执行时间告警
    • 记录任务执行日志
    • 定期检查任务输出

10.2 日志管理最佳实践

  1. 日志策略

    • 制定统一的日志格式
    • 设置合适的日志级别
    • 实施日志轮转策略
    • 建立日志保留政策
  2. 性能优化

    • 避免过度日志记录
    • 使用异步日志写入
    • 定期清理历史日志
    • 监控日志磁盘使用
  3. 安全和合规

    • 保护敏感信息
    • 实施访问控制
    • 建立审计跟踪
    • 满足合规要求

10.3 故障排查指南

定时任务不执行:

1
2
3
4
5
6
7
# 检查步骤
1. 检查cron服务状态:systemctl status crond
2. 查看cron日志:tail -f /var/log/cron
3. 验证crontab语法:crontab -l
4. 检查脚本权限:ls -la /path/to/script
5. 手动执行脚本测试:/path/to/script
6. 检查环境变量:env

日志不记录:

1
2
3
4
5
6
# 检查步骤
1. 检查rsyslog服务:systemctl status rsyslog
2. 验证配置文件:rsyslogd -N1
3. 检查磁盘空间:df -h /var/log
4. 查看权限设置:ls -la /var/log
5. 检查SELinux状态:getenforce

总结

Linux定时任务和日志管理是系统运维的重要组成部分,需要掌握:

  1. 定时任务管理:熟练使用crontab、at、systemd timer等工具
  2. 日志系统理解:掌握rsyslog、journald等日志系统的配置和使用
  3. 自动化运维:编写高质量的脚本实现自动化管理
  4. 监控和告警:建立完善的监控体系,及时发现和处理问题
  5. 最佳实践应用:遵循安全、性能、可维护性等最佳实践

通过系统性的学习和实践,可以有效提升Linux系统的自动化运维能力,确保系统稳定可靠运行。建议在实际工作中结合具体业务需求,制定适合的定时任务和日志管理策略。

本站由 提供部署服务