一、进程监控与自动重启脚本
1. 脚本源码
#!/bin/bash
# =============================================
# 脚本名称: process_monitor.sh
# 功能: 每隔5秒监控指定进程,若不存在则自动重启并记录日志
# 用法: ./process_monitor.sh <进程名> <启动命令>
# 示例: ./process_monitor.sh nginx "systemctl start nginx"
# =============================================
# 日志文件路径
LOG_FILE="/var/log/process_monitor.log"
# 函数:记录带时间戳的日志
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 函数:检查进程是否存在(使用 kill -0 检测)
# 参数: $1 - 进程名
# 返回: 0 表示进程存在,非0表示不存在
check_process() {
local proc_name="$1"
# 使用 pgrep 精确匹配进程名(避免误匹配子串)
pgrep -x "$proc_name" > /dev/null 2>&1
return $?
}
# 函数:获取进程 PID 和状态信息
# 参数: $1 - 进程名
get_process_info() {
local proc_name="$1"
local pid=$(pgrep -x "$proc_name" | head -1)
if [[ -n "$pid" ]]; then
# 从 /proc/<pid>/status 中提取状态
local state=$(awk '/^State:/ {print $2}' "/proc/$pid/status" 2>/dev/null)
echo "PID: $pid, State: ${state:-Unknown}"
else
echo "Process not found"
fi
}
# 主监控循环
monitor_loop() {
local proc_name="$1"
local start_cmd="$2"
while true; do
if check_process "$proc_name"; then
# 进程存在:输出 PID 和状态
info=$(get_process_info "$proc_name")
log_message "[INFO] Process '$proc_name' is running - $info"
else
# 进程不存在:尝试重启
log_message "[WARN] Process '$proc_name' not running. Attempting restart..."
eval "$start_cmd"
sleep 2 # 给启动留出时间
if check_process "$proc_name"; then
info=$(get_process_info "$proc_name")
log_message "[OK] Process '$proc_name' restarted successfully - $info"
else
log_message "[ERROR] Failed to restart process '$proc_name'."
fi
fi
sleep 5
done
}
# 脚本入口
if [[ $# -lt 2 ]]; then
echo "Usage: $0 <process_name> <start_command>"
echo "Example: $0 sshd 'systemctl start sshd'"
exit 1
fi
monitor_loop "$1" "$2"
2. 脚本中进程管理相关命令解释
| 命令 / 用法 | 作用与说明 |
|---|---|
ps aux | 列出系统中所有运行进程的详细信息,常用于人工排查或脚本中 grep 过滤特定进程。本脚本未直接使用,因 pgrep 更精确高效。 |
kill -0 <PID> | 发送信号 0 给进程,不会实际终止进程,仅检查进程是否存在且有权限访问。若进程存在返回 0,否则非 0。本脚本用 pgrep -x 实现类似存在性检测。 |
pgrep -x <name> | 精确匹配进程名(-x 防止匹配部分字符串),返回进程 PID,用于检测和获取 PID。 |
/proc/<PID>/status | 虚拟文件,包含进程状态(State: 字段)、内存等信息。脚本从中提取进程状态。 |
eval "$start_cmd" | 执行启动命令,支持复杂命令(如带管道、重定向)。 |
& (后台运行) | 脚本中未直接使用,但若需将监控脚本本身置于后台,可在执行时添加 &,例如 ./monitor.sh nginx "systemctl start nginx" &。 |
jobs / fg | jobs 列出当前 Shell 的后台任务,fg %n 将后台任务调至前台。本脚本未涉及,但常用于交互式作业控制。 |
3. 运行截图说明(模拟输出)
执行 ./process_monitor.sh sshd "systemctl start sshd" 后,终端及日志内容如下:
若手动停止 sshd:
systemctl stop sshd,则输出:
4. 设置开机自启动或 Cron 定期执行
方法一:通过 Systemd Service 实现开机自启 + 持续监控
创建服务文件 /etc/systemd/system/process-monitor.service:
[Unit]
Description=Process Monitor for sshd
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/process_monitor.sh sshd "systemctl start sshd"
Restart=always
User=root
[Install]
WantedBy=multi-user.target
启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable process-monitor.service
sudo systemctl start process-monitor.service
方法二:通过 Cron 的 @reboot 特性
在 crontab 中添加(crontab -e):
@reboot /usr/local/bin/process_monitor.sh sshd "systemctl start sshd" &
注意:需使用绝对路径,且末尾 & 使其后台运行,避免阻塞 cron。
二、周期性任务设计与内核管理实践
1. Crontab 配置内容
执行 crontab -e 添加以下两行:
# 每周日凌晨3点清理 /tmp 下超过7天的文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete 2>/dev/null
# 每天中午12点记录系统进程数和内存使用量
0 12 * * * echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log
2. Cron 时间语法、环境变量问题及日志查看
-
时间字段含义(共5个):
* * * * * 命令 ┬ ┬ ┬ ┬ ┬ │ │ │ │ └─── 星期几 (0 - 7,0或7为周日) │ │ │ └────── 月份 (1 - 12) │ │ └─────────── 日期 (1 - 31) │ └──────────────── 小时 (0 - 23) └─────────────────── 分钟 (0 - 59)示例中:
0 3 * * 0→ 每周日 03:000 12 * * *→ 每天 12:00
-
环境变量问题:
-
Cron 运行时环境极其精简,仅有少数默认变量(
PATH=/usr/bin:/bin),不加载用户~/.bashrc等。 -
解决方案:
- 在命令中使用绝对路径(如
/usr/bin/find、/bin/echo)。 - 在 crontab 文件顶部显式定义变量:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - 或将命令封装成脚本,在脚本中
source所需环境。
- 在命令中使用绝对路径(如
-
-
日志查看:
-
Cron 执行日志(Linux 发行版不同):
- Debian/Ubuntu:
/var/log/syslog(过滤CRON) - RHEL/CentOS:
/var/log/cron
- Debian/Ubuntu:
-
查看命令示例:
grep CRON /var/log/syslog | tail -20
-
3. 内核参数修改实践:vm.swappiness
临时修改(重启失效):
sudo sysctl -w vm.swappiness=10
永久修改(写入配置文件):
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
# 或者独立文件
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf # 立即生效
查看当前值(两种方式):
# 方式一:通过 sysctl
sysctl vm.swappiness
# 方式二:读取 /proc 虚拟文件
cat /proc/sys/vm/swappiness
4. /proc 文件系统的虚拟文件特性
/proc是一个伪文件系统(procfs),存在于内存中,不占用磁盘空间。- 其下的文件和目录在访问时由内核动态生成内容,反映当前内核状态、进程信息、硬件配置等。
- 例如
/proc/sys/vm/swappiness文件实际上对应内核参数vm.swappiness,读取即查询内核值,写入(需 root)即修改内核运行时参数。 - 该特性使系统管理和监控无需额外工具,直接通过文件操作即可与内核交互。
5. 展示 crontab -l 输出和日志条目示例
crontab -l 输出:
# 每周日凌晨3点清理 /tmp 下超过7天的文件
0 3 * * 0 find /tmp -type f -mtime +7 -delete 2>/dev/null
# 每天中午12点记录系统进程数和内存使用量
0 12 * * * echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log
/var/log/syslog 中的 Cron 条目示例:
Apr 14 12:00:01 hostname CRON[12345]: (root) CMD (echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processes: $(ps -e | wc -l), Memory: $(free -m | awk '/^Mem:/ {print $3"/"$2 " MB used"}')" >> /var/log/system_health.log)
/var/log/system_health.log 内容示例:
[2026-04-14 12:00:01] Processes: 187, Memory: 1024/7982 MB used
[2026-04-15 12:00:01] Processes: 192, Memory: 1100/7982 MB used
6. 修改内核参数前后对比效果
修改前(默认值通常为 60):
$ sysctl vm.swappiness
vm.swappiness = 60
$ cat /proc/sys/vm/swappiness
60
修改后(临时或永久):
$ sudo sysctl -w vm.swappiness=10
vm.swappiness = 10
$ sysctl vm.swappiness
vm.swappiness = 10
$ cat /proc/sys/vm/swappiness
10
free -m 对比效果(swappiness 值影响内核使用交换空间的倾向,较低值减少交换使用):
- 修改前:内存压力稍大时即使用 Swap。
- 修改后:尽量使用物理内存,减少磁盘 I/O,适合数据库服务器等场景。
三、网络管理相关学习内容总结
网络管理部分主要涵盖以下知识点:
1. 网络基础与协议
- TCP/IP 协议栈:理解分层模型(应用层、传输层、网络层、链路层),重点掌握 IP 地址分类、子网掩码、CIDR 表示法。
- IP 协议:IPv4 地址结构、私有地址范围(A/B/C 类)、路由原理。
- TCP/UDP:端口概念、三次握手/四次挥手、常用服务端口(22/SSH, 80/HTTP, 443/HTTPS 等)。
2. 网络配置实践
-
网卡命名:传统
eth0与Predictable Network Interface Names(如ens33、enp0s3)。 -
网络配置文件:
- Debian/Ubuntu:
/etc/network/interfaces - RHEL/CentOS:
/etc/sysconfig/network-scripts/ifcfg-*
- Debian/Ubuntu:
-
使用
ip命令(取代ifconfig):ip addr show– 查看 IP 地址ip link set dev eth0 up/down– 启用/禁用网卡ip route show– 查看路由表
-
nmcli:NetworkManager 命令行工具,用于图形化/命令行统一管理网络连接。
3. 常用网络工具命令
| 命令 | 用途 |
|---|---|
ping | 测试网络连通性(ICMP) |
ss | 查看 socket 统计信息(替代 netstat),ss -tunlp 常用 |
traceroute / mtr | 跟踪路由路径 |
nslookup / dig | DNS 查询 |
curl / wget | HTTP/HTTPS 客户端,用于下载或 API 测试 |
tcpdump | 抓包分析,网络排错利器 |
nc (netcat) | 端口扫描、数据传输、简易服务端/客户端 |
4. 高级网络特性
-
网卡绑定(Bonding) :将多个物理网卡聚合成一个逻辑接口,提供冗余或带宽提升(模式如
active-backup、balance-rr)。 -
网络组(Network Teaming) :RHEL 7+ 推荐的绑定替代方案,使用
teamd守护进程。 -
网桥(Bridge) :用于虚拟化环境,使虚拟机与宿主机共享同一物理网络。
-
诊断工具:
ethtool– 查看/修改网卡参数(速率、双工模式等)iptraf-ng/nethogs– 实时流量监控mtr– 结合 ping 与 traceroute 的动态路由分析
通过该课程学习,应能独立完成 Linux 系统的网络配置、故障排查、服务端口管理以及基础网络性能优化。