进程管理

title

进程管理是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

最佳实践

进程管理原则

  1. 监控关键进程: 定期检查重要服务进程状态
  2. 合理设置优先级: 根据业务重要性调整进程优先级
  3. 资源限制: 防止单个进程占用过多系统资源
  4. 日志记录: 记录进程状态变化和异常情况
  5. 自动化处理: 使用脚本自动处理常见问题

性能优化建议

  1. 减少不必要的进程: 禁用不需要的服务
  2. 优化进程启动: 调整服务启动顺序和依赖关系
  3. 合理分配资源: 根据硬件配置调整进程资源限制
  4. 监控和告警: 建立完善的监控和告警机制

相关工具和命令

  • ps - 进程状态查看
  • top/htop - 实时进程监控
  • kill/killall/pkill - 进程终止
  • jobs/fg/bg - 作业控制
  • nohup/screen/tmux - 会话管理
  • systemctl - 系统服务管理
  • pgrep/pidof - 进程查找
  • lsof - 查看打开文件
  • strace/ltrace - 系统调用跟踪

进程管理是Linux系统管理的核心技能,掌握这些知识和技能对于维护稳定、高效的Linux系统至关重要。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""