进程管理
进程管理是Linux系统管理的核心技能之一,涉及进程的创建、监控、控制、优化和故障排查等多个方面。
进程基础概念
进程状态
Linux进程有以下几种状态:
- R (Running): 运行中或可运行状态
- S (Sleeping): 可中断的睡眠状态
- D (Disk Sleep): 不可中断的睡眠状态
- T (Stopped): 停止状态
- Z (Zombie): 僵尸进程
- X (Dead): 死亡状态
进程类型
# 前台进程:在终端中直接运行
command
# 后台进程:在后台运行
command &
# 守护进程:系统服务进程
systemctl start service_name
# 孤儿进程:父进程已终止的进程
# 僵尸进程:子进程已终止但父进程未收集退出状态
进程查看和监控
基本进程查看
# 查看所有进程
ps aux
ps -ef
# 查看进程树
pstree
pstree -p # 显示PID
# 实时进程监控
top
htop
# 查看特定用户的进程
ps -u username
pgrep -u username
# 查看特定进程
ps -p PID
ps -C process_name
# 查看进程详细信息
cat /proc/PID/status
cat /proc/PID/cmdline
高级进程监控
# 监控进程资源使用
pidstat -u 1 5 # CPU使用率
pidstat -r 1 5 # 内存使用
pidstat -d 1 5 # 磁盘I/O
pidstat -w 1 5 # 上下文切换
# 监控特定进程
pidstat -p PID 1 5
# 查看进程打开的文件
lsof -p PID
# 查看进程网络连接
netstat -p | grep PID
ss -p | grep PID
# 查看进程内存映射
pmap PID
cat /proc/PID/maps
# 监控进程系统调用
strace -p PID
进程性能分析
# 分析进程CPU使用
perf top -p PID
perf record -p PID sleep 30
perf report
# 查看进程负载
uptime
cat /proc/loadavg
# 查看进程I/O统计
iotop
cat /proc/PID/io
# 查看进程内存详情
cat /proc/PID/smaps
cat /proc/PID/stat
进程控制和管理
信号控制
# 常用信号
kill -l # 列出所有信号
# SIGTERM (15) - 正常终止信号
kill PID
kill -15 PID
# SIGKILL (9) - 强制终止信号
kill -9 PID
kill -KILL PID
# SIGHUP (1) - 挂起信号,通常用于重新加载配置
kill -1 PID
kill -HUP PID
# SIGSTOP (19) - 暂停进程
kill -19 PID
kill -STOP PID
# SIGCONT (18) - 继续运行暂停的进程
kill -18 PID
kill -CONT PID
# SIGUSR1 (10) 和 SIGUSR2 (12) - 用户自定义信号
kill -USR1 PID
kill -USR2 PID
进程终止
# 按PID终止进程
kill PID
# 按进程名终止
killall process_name
pkill process_name
# 强制终止所有匹配的进程
killall -9 process_name
pkill -9 -f pattern
# 终止用户的所有进程
killall -u username
pkill -u username
# 交互式终止进程
kill -9 $(ps aux | grep pattern | awk '{print $2}')
作业控制
# 将前台进程移到后台
Ctrl+Z # 暂停当前进程
bg # 将暂停的进程移到后台继续运行
# 将后台进程移到前台
fg %job_number
# 查看作业列表
jobs
jobs -l # 显示PID
# 后台运行命令
command &
# 不挂断运行
nohup command &
nohup command > output.log 2>&1 &
# 使用screen或tmux会话管理
screen -S session_name
tmux new -s session_name
系统服务管理
systemd服务管理
# 启动/停止/重启服务
systemctl start service_name
systemctl stop service_name
systemctl restart service_name
systemctl reload service_name
# 查看服务状态
systemctl status service_name
systemctl is-active service_name
systemctl is-enabled service_name
# 启用/禁用开机自启
systemctl enable service_name
systemctl disable service_name
# 列出所有服务
systemctl list-units --type=service
systemctl list-units --type=service --state=running
# 查看服务依赖关系
systemctl list-dependencies service_name
# 编辑服务配置
systemctl edit service_name
systemctl edit --full service_name
# 重新加载systemd配置
systemctl daemon-reload
自定义服务创建
# 创建自定义服务文件
sudo vim /etc/systemd/system/myapp.service
# 基本服务配置模板
[Unit]
Description=My Application
Documentation=https://example.com/docs
After=network.target
Wants=network.target
[Service]
Type=simple
User=myuser
Group=mygroup
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/myapp
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -TERM $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
# 启用新服务
systemctl daemon-reload
systemctl enable myapp.service
systemctl start myapp.service
服务监控和故障排查
# 查看服务日志
journalctl -u service_name
journalctl -u service_name -f # 实时跟踪
journalctl -u service_name --since today
journalctl -u service_name --since "2023-12-01" --until "2023-12-31"
# 查看系统启动日志
journalctl -b
journalctl -b -1 # 上次启动日志
# 分析系统启动时间
systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze plot > boot.svg
# 查看失败的服务
systemctl --failed
systemctl list-units --failed
# 重置失败状态
systemctl reset-failed service_name
进程优先级和调度
进程优先级
# 查看进程优先级
ps -eo pid,ppid,ni,pri,pcpu,comm
# 调整进程优先级
nice -n 10 command # 以较低优先级启动
nice -n -10 command # 以较高优先级启动
# 修改运行中进程的优先级
renice 10 PID # 降低优先级
renice -10 PID # 提高优先级
# 按用户或进程组调整优先级
renice 5 -u username
renice 5 -g groupname
# 查看当前优先级
ps -o pid,ni,comm PID
CPU亲和性
# 查看进程CPU亲和性
taskset -p PID
# 设置进程CPU亲和性
taskset -p 0x1 PID # 绑定到CPU 0
taskset -p 0x3 PID # 绑定到CPU 0和1
taskset -c 0,1 PID # 绑定到CPU 0和1
# 启动时设置CPU亲和性
taskset -c 0,1 command
# 查看CPU信息
lscpu
cat /proc/cpuinfo
nproc # CPU核心数
内存管理
# 查看进程内存使用
ps -o pid,vsz,rss,comm
pmap PID
# 监控内存使用
free -h
watch -n 1 'free -h'
# 查看进程内存详情
cat /proc/PID/status | grep -E "VmSize|VmRSS|VmSwap"
# 内存限制(cgroup)
echo 100M > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
echo PID > /sys/fs/cgroup/memory/mygroup/cgroup.procs
性能调优和监控
系统性能监控
# 综合系统监控
top
htop
atop
glances
# CPU监控
mpstat 1 5
sar -u 1 5
iostat -c 1 5
# 内存监控
vmstat 1 5
sar -r 1 5
# I/O监控
iotop
iostat -x 1 5
sar -d 1 5
# 网络监控
iftop
nethogs
ss -i
进程调优
# 调整进程资源限制
ulimit -c unlimited # 核心转储文件大小
ulimit -n 65536 # 文件描述符数量
ulimit -u 4096 # 进程数量
# 设置进程资源限制(systemd)
# 在服务文件中添加:
LimitNOFILE=65536
LimitNPROC=4096
LimitCORE=infinity
# 使用cgroup限制资源
systemctl set-property httpd.service CPUQuota=50%
systemctl set-property httpd.service MemoryLimit=1G
故障排查和调试
进程故障排查
# 查找占用CPU最多的进程
ps aux --sort=-%cpu | head -10
top -o %CPU
# 查找占用内存最多的进程
ps aux --sort=-%mem | head -10
top -o %MEM
# 查找僵尸进程
ps aux | awk '$8 ~ /Z/ { print }'
ps -eo pid,ppid,state,comm | grep Z
# 查找进程打开的文件过多
lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
# 查看进程等待
cat /proc/PID/wchan
调试工具
# 系统调用跟踪
strace -p PID
strace -o trace.log command
# 库函数调用跟踪
ltrace -p PID
ltrace command
# 生成核心转储
gcore PID
kill -SEGV PID # 强制生成核心转储
# 分析核心转储
gdb program core_file
# 性能分析
perf record -g command
perf report
# 内存泄漏检测
valgrind --tool=memcheck --leak-check=full command
日志分析
# 系统日志
tail -f /var/log/messages
tail -f /var/log/syslog
# 内核日志
dmesg | tail
dmesg -w
# 应用程序日志
tail -f /var/log/application.log
# 使用journalctl
journalctl -f # 实时日志
journalctl -p err # 只显示错误
journalctl --since "1 hour ago"
自动化和脚本
进程监控脚本
#!/bin/bash
# process_monitor.sh
PROCESS_NAME="$1"
MAX_CPU=80
MAX_MEM=80
LOG_FILE="/var/log/process_monitor.log"
if [ -z "$PROCESS_NAME" ]; then
echo "用法: $0 <进程名>"
exit 1
fi
while true; do
# 检查进程是否运行
if ! pgrep "$PROCESS_NAME" > /dev/null; then
echo "$(date): 进程 $PROCESS_NAME 未运行" >> $LOG_FILE
# 这里可以添加重启逻辑
sleep 60
continue
fi
# 获取进程资源使用情况
PID=$(pgrep "$PROCESS_NAME" | head -1)
CPU_USAGE=$(ps -o %cpu= -p $PID | tr -d ' ')
MEM_USAGE=$(ps -o %mem= -p $PID | tr -d ' ')
# 检查CPU使用率
if (( $(echo "$CPU_USAGE > $MAX_CPU" | bc -l) )); then
echo "$(date): 进程 $PROCESS_NAME (PID: $PID) CPU使用率过高: $CPU_USAGE%" >> $LOG_FILE
fi
# 检查内存使用率
if (( $(echo "$MEM_USAGE > $MAX_MEM" | bc -l) )); then
echo "$(date): 进程 $PROCESS_NAME (PID: $PID) 内存使用率过高: $MEM_USAGE%" >> $LOG_FILE
fi
sleep 60
done
服务健康检查脚本
#!/bin/bash
# service_health_check.sh
SERVICES=("nginx" "mysql" "redis")
LOG_FILE="/var/log/service_health.log"
check_service() {
local service="$1"
local status=$(systemctl is-active $service)
if [ "$status" != "active" ]; then
echo "$(date): 服务 $service 状态异常: $status" >> $LOG_FILE
# 尝试重启服务
systemctl restart $service
sleep 5
# 再次检查
if systemctl is-active $service > /dev/null; then
echo "$(date): 服务 $service 重启成功" >> $LOG_FILE
else
echo "$(date): 服务 $service 重启失败" >> $LOG_FILE
# 发送告警
send_alert "服务 $service 重启失败"
fi
fi
}
send_alert() {
local message="$1"
# 这里可以集成邮件、短信或其他告警方式
echo "告警: $message" | logger -t service_health
}
# 检查所有服务
for service in "${SERVICES[@]}"; do
check_service $service
done
资源清理脚本
#!/bin/bash
# resource_cleanup.sh
LOG_FILE="/var/log/cleanup.log"
# 清理僵尸进程
cleanup_zombies() {
local zombies=$(ps aux | awk '$8 ~ /Z/ { print $2 }')
if [ -n "$zombies" ]; then
echo "$(date): 发现僵尸进程: $zombies" >> $LOG_FILE
for pid in $zombies; do
# 尝试终止父进程
ppid=$(ps -o ppid= -p $pid 2>/dev/null | tr -d ' ')
if [ -n "$ppid" ]; then
kill -CHLD $ppid 2>/dev/null
fi
done
fi
}
# 清理过期的进程
cleanup_old_processes() {
# 查找运行时间超过24小时的特定进程
ps -eo pid,etime,comm | awk '
$2 ~ /-/ && $3 ~ /temp_process/ {
# 提取天数
split($2, a, "-")
if (a[1] >= 1) print $1
}' | while read pid; do
echo "$(date): 终止长时间运行的进程 PID: $pid" >> $LOG_FILE
kill -TERM $pid
done
}
# 清理高内存使用进程
cleanup_high_memory() {
# 查找内存使用超过指定阈值的进程
ps aux --sort=-%mem | awk '
NR > 1 && $4 > 80 && $11 !~ /^(kernel|systemd)/ {
print $2, $4, $11
}' | head -5 | while read pid mem cmd; do
echo "$(date): 高内存使用进程 PID: $pid, 内存: $mem%, 命令: $cmd" >> $LOG_FILE
# 这里可以添加告警或处理逻辑
done
}
# 执行清理任务
cleanup_zombies
cleanup_old_processes
cleanup_high_memory
echo "$(date): 资源清理完成" >> $LOG_FILE
高级进程管理
进程命名空间
# 查看进程命名空间
ls -la /proc/PID/ns/
# 运行在新的命名空间中
unshare --pid --fork --mount-proc bash
# 查看进程的cgroup
cat /proc/PID/cgroup
# 进入进程的命名空间
nsenter -t PID -n -p
容器化进程管理
# Docker容器进程管理
docker ps
docker exec -it container_id bash
docker logs container_id
docker stats container_id
# 查看容器内进程
docker exec container_id ps aux
# 限制容器资源
docker run --cpus="1.5" --memory="2g" image_name
进程安全
# 检查进程权限
ps -eo pid,user,group,comm
ls -la /proc/PID/exe
# 查看进程安全上下文(SELinux)
ps -eZ
# 设置进程安全限制
chroot /new/root command
最佳实践
进程管理原则
- 监控关键进程: 定期检查重要服务进程状态
- 合理设置优先级: 根据业务重要性调整进程优先级
- 资源限制: 防止单个进程占用过多系统资源
- 日志记录: 记录进程状态变化和异常情况
- 自动化处理: 使用脚本自动处理常见问题
性能优化建议
- 减少不必要的进程: 禁用不需要的服务
- 优化进程启动: 调整服务启动顺序和依赖关系
- 合理分配资源: 根据硬件配置调整进程资源限制
- 监控和告警: 建立完善的监控和告警机制
相关工具和命令
ps
- 进程状态查看top/htop
- 实时进程监控kill/killall/pkill
- 进程终止jobs/fg/bg
- 作业控制nohup/screen/tmux
- 会话管理systemctl
- 系统服务管理pgrep/pidof
- 进程查找lsof
- 查看打开文件strace/ltrace
- 系统调用跟踪
进程管理是Linux系统管理的核心技能,掌握这些知识和技能对于维护稳定、高效的Linux系统至关重要。