linux初级_进程管理

TJCcc 发布于 2025-11-09 27 次阅读


一、进程查看命令

1. ps (Process Status) - 进程状态

常用选项组合:

ps aux                    # 查看所有用户的所有进程
ps -ef                    # 完整格式显示所有进程
ps -eLf                   # 显示线程信息
ps -o pid,ppid,cmd,%mem,%cpu --sort=-%mem | head  # 自定义输出格式并按内存排序

ps aux 输出字段含义:

USER       PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1   0.0  0.1 169316 13104 ?        Ss   08:30   0:01 /sbin/init
  • USER:进程所有者
  • PID (Process ID):进程ID
  • %CPU:CPU使用率百分比
  • %MEM:内存使用率百分比
  • VSZ (Virtual Memory Size):虚拟内存大小(KB)
  • RSS (Resident Set Size):物理内存大小(KB)
  • TTY:进程关联的终端
  • ?:没有关联终端(后台进程)
  • pts/0:伪终端
  • tty1:物理终端
  • STAT (Process State):进程状态
  • R (Running):运行中
  • S (Sleeping):睡眠中(可中断)
  • D (Uninterruptible Sleep):不可中断睡眠(通常等待I/O)
  • T (Stopped):停止状态
  • Z (Zombie):僵尸进程
  • <:高优先级
  • N:低优先级
  • s:会话首进程
  • +:前台进程组
  • START:进程启动时间
  • TIME:进程占用CPU总时间
  • COMMAND:进程执行的命令

2. uptime - 系统运行时间

$ uptime
 09:15:30 up 15 days,  3:25,  3 users,  load average: 0.05, 0.10, 0.15

输出含义

  • 09:15:30:当前系统时间
  • up 15 days, 3:25:系统已运行15天3小时25分钟
  • 3 users:当前登录用户数
  • load average: 0.05, 0.10, 0.15:系统平均负载(1分钟、5分钟、15分钟)

平均负载说明

  • 单核CPU:1.00表示100%负载
  • 四核CPU:4.00表示100%负载
  • 小于CPU核心数表示系统空闲

3. top (Table of Processes) - 动态进程查看

top界面各区域含义:

top - 09:20:15 up 15 days,  3:30,  3 users,  load average: 0.05, 0.08, 0.12
Tasks: 250 total,   1 running, 249 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.5 us,  0.5 sy,  0.0 ni, 98.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7845.8 total,    256.1 free,   4096.2 used,   3493.5 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   3450.2 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 mysql     20   0 3284676 1.2g   23456 S   2.3  15.6 150:30.25 mysqld

系统概要信息

  • Tasks:进程统计(总数、运行、睡眠、停止、僵尸)
  • %Cpu(s):CPU使用情况
  • us (user)1.5% - 用户空间进程占用 CPU 时间比例
  • sy (system)0.5% - 内核空间占用 CPU 时间比例
    • 操作系统内核处理系统调用、中断、进程调度等消耗的 CPU
  • ni (nice)0.0% - 被调整过优先级的用户进程占用 CPU
    • 使用 nice 命令调整优先级的进程消耗的 CPU
  • id (idle)98.0% - CPU 空闲时间比例
    • 这是最关键指标:表示系统有 98% 的 CPU 资源处于空闲状态
    • 说明系统负载很轻,有充足的 CPU 资源储备
  • wa (I/O wait)0.0% - CPU 等待 I/O 完成的时间比例
    • 表示没有进程在等待磁盘、网络等 I/O 操作
    • 在您的五层架构中,如果这个值高,可能表示存储服务或数据库有 I/O 瓶颈
  • hi (hardware interrupts)0.0% - 处理硬件中断时间
    • 来自硬盘、网卡等硬件设备的中断处理
  • si (software interrupts)0.0% - 处理软件中断时间
    • 系统内部的软件中断处理
  • st (steal time)0.0% - 被虚拟化平台"偷走"的时间

进程列表字段

  • PR (Priority):优先级
  • NI (Nice):nice值(-20到19,值越小优先级越高)
  • VIRT (Virtual Memory):虚拟内存大小
  • RES (Resident Memory):物理内存大小
  • SHR (Shared Memory):共享内存大小

top交互命令:

h                # 显示帮助
P (大写)          # 按CPU使用率排序
M (大写)          # 按内存使用率排序
N (大写)          # 按PID排序
k                # 杀死进程
r                # 调整进程优先级(nice值)
1                # 显示每个CPU核心的使用情况
q                # 退出top

4. pmap (Process Memory Map) - 进程内存映射

# 查看进程的内存映射
pmap 1234

# 显示详细信息
pmap -x 1234

# 扩展信息
pmap -XX 1234

# 示例输出:
$ pmap -x 1234
1234:   /usr/sbin/mysqld
Address           Kbytes     RSS   Dirty Mode  Mapping
000055f8a4b2e000   2748    1744       0 r-x-- mysqld
000055f8a4de1000     16      16      16 r---- mysqld
000055f8a4de5000     76      60      60 rw--- mysqld
...
total kB         3284676  1256892  892344

输出字段

  • Address:内存地址
  • Kbytes:内存大小(KB)
  • RSS (Resident Set Size):实际使用的物理内存
  • Dirty:脏页大小(已修改但未写入磁盘)
  • Mode:内存权限(r=读, w=写, x=执行, s=共享, p=私有)
  • Mapping:内存映射的文件或区域

二、中断管理

软中断 (Software Interrupts) vs 硬中断 (Hardware Interrupts)

查看中断信息:

# 查看/proc/interrupts文件
cat /proc/interrupts

# 查看软中断统计
cat /proc/softirqs

# 实时监控中断
watch -n 1 'cat /proc/interrupts | head -20'

区别:

  • 硬中断:由硬件设备产生,需要立即处理(如键盘输入、网络包到达)
  • 软中断:由内核产生,可以稍后处理(如定时器、网络数据处理)

中断相关统计:

# 查看CPU中断统计
mpstat -P ALL 1

# 查看系统统计信息
vmstat 1 5

三、进程相关工具

1. lsof (List Open Files) - 列出打开文件

# 查看进程打开的文件
lsof -p 1234

# 查看文件被哪些进程打开
lsof /var/log/syslog

# 查看端口占用
lsof -i :80
lsof -i TCP:22

# 查看用户打开的文件
lsof -u username

# 查看网络连接
lsof -i

# 常用组合:
lsof -p PID                  # 查看指定进程打开的文件
lsof -c process_name         # 查看指定命令打开的文件
lsof +D /path/to/directory   # 查看目录下被打开的文件
lsof -u ^root                # 查看非root用户打开的文件

2. kill - 发送信号给进程

# 常用信号:
kill -l                      # 列出所有信号

# 常用信号编号和含义:
kill -1  PID  # SIGHUP (1)   - 挂起,重新读取配置
kill -2  PID  # SIGINT (2)   - 中断(同Ctrl+C)
kill -3  PID  # SIGQUIT (3)  - 退出并生成core文件
kill -9  PID  # SIGKILL (9)  - 强制杀死(无法捕获)
kill -15 PID  # SIGTERM (15) - 优雅终止(默认信号)

# 使用示例:
kill 1234                    # 发送SIGTERM(15)
kill -9 1234                 # 强制杀死进程
kill -HUP 1234               # 重新加载配置

3. pkill (Process Kill) - 按名称杀死进程

# 按进程名杀死
pkill firefox

# 按完整命令名杀死
pkill -f "python app.py"

# 发送特定信号
pkill -9 mysql
pkill -HUP nginx

# 按用户杀死进程
pkill -u username

# 精确匹配进程名
pkill -x process_name

4. killall - 按名称杀死所有匹配进程

# 杀死所有同名进程
killall chrome

# 发送特定信号
killall -9 python
killall -HUP sshd

# 交互式确认
killall -i process_name

# 等待进程结束
killall -w process_name

5. w (Who and what) - 显示登录用户及活动

$ w
 09:25:30 up 15 days,  3:35,  3 users,  load average: 0.08, 0.09, 0.11
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
john     pts/0    192.168.1.100    08:45    5.00s  0.05s  0.00s w
alice    pts/1    192.168.1.101    09:10   15:00   0.10s  0.02s vim file.txt
bob      tty1     :0               08:30   25:00   1:50   0.01s bash

输出字段

  • USER:登录用户名
  • TTY:终端类型
  • FROM:登录来源IP
  • LOGIN@:登录时间
  • IDLE:空闲时间
  • JCPU:该终端所有进程使用的CPU时间
  • PCPU:当前进程使用的CPU时间
  • WHAT:用户当前执行的命令

四、后台进程管理

1. screen (GNU Screen) - 终端多路复用器

基本使用:

# 安装screen
sudo apt-get install screen  # Debian/Ubuntu
sudo yum install screen      # CentOS/RHEL

# 启动新screen会话
screen
screen -S session_name       # 指定会话名称

# 会话管理快捷键(Ctrl+a后按):
#   d - 分离会话(detach)
#   c - 创建新窗口
#   n - 下一个窗口
#   p - 上一个窗口
#   " - 显示窗口列表
#   A - 重命名当前窗口
#   k - 杀死当前窗口

# 会话管理命令:
screen -ls                   # 列出所有会话
screen -r session_name       # 恢复会话
screen -r PID                # 通过PID恢复会话
screen -X -S session_name quit # 结束指定会话

实用场景:

# 在screen中运行长时间任务
screen -S data_processing
./long_running_script.sh
# 按Ctrl+a, d 分离会话

# 稍后恢复查看进度
screen -r data_processing

2. nohup (No Hang Up) - 忽略挂起信号运行命令

基本用法:

# 运行命令并忽略挂起信号
nohup ./script.sh &

# 指定输出文件
nohup ./script.sh > output.log 2>&1 &

# 将标准错误和标准输出重定向到不同文件
nohup ./script.sh > stdout.log 2> stderr.log &

nohup.out文件说明:

  • 默认行为:nohup会自动创建nohup.out文件记录命令输出
  • 文件位置:在当前目录或用户home目录(如果当前目录不可写)
  • 自定义输出:可以通过重定向指定输出文件

实际应用示例:

# 后台运行Web服务器
nohup python app.py > app.log 2>&1 &

# 后台处理数据
nohup ./data_processor.sh > /var/log/data_processor.log 2>&1 &

# 检查运行状态
ps aux | grep data_processor
tail -f /var/log/data_processor.log

# 停止进程
pkill -f data_processor.sh

结合使用screen和nohup:

# 最佳实践:在screen中使用nohup
screen -S my_service
nohup ./service.sh > service.log 2>&1 &
# 按Ctrl+a, d分离

# 这样可以:
# 1. 随时查看进程输出:screen -r my_service → tail -f service.log
# 2. 进程不会因SSH断开而终止
# 3. 有完整的日志记录

五、进程管理最佳实践

1. 进程监控脚本

#!/bin/bash
# process_monitor.sh

# 监控高CPU进程
echo "=== 高CPU进程 ==="
ps aux --sort=-%cpu | head -10

# 监控高内存进程
echo -e "\n=== 高内存进程 ==="
ps aux --sort=-%mem | head -10

# 检查僵尸进程
echo -e "\n=== 僵尸进程检查 ==="
ps aux | awk '$8=="Z" {print $0}'

# 检查被占用端口
echo -e "\n=== 网络端口占用 ==="
netstat -tlnp | grep LISTEN

2. 服务管理脚本

#!/bin/bash
# service_manager.sh

SERVICE="my_app"
LOG_FILE="/var/log/${SERVICE}.log"
PID_FILE="/var/run/${SERVICE}.pid"

start_service() {
    echo "启动 $SERVICE..."
    nohup ./$SERVICE > $LOG_FILE 2>&1 &
    echo $! > $PID_FILE
    echo "服务已启动,PID: $(cat $PID_FILE)"
}

stop_service() {
    if [ -f $PID_FILE ]; then
        PID=$(cat $PID_FILE)
        echo "停止 $SERVICE (PID: $PID)..."
        kill $PID
        rm -f $PID_FILE
        echo "服务已停止"
    else
        echo "PID文件不存在,服务可能未运行"
    fi
}

case "$1" in
    start)
        start_service
        ;;
    stop)
        stop_service
        ;;
    restart)
        stop_service
        sleep 2
        start_service
        ;;
    status)
        if [ -f $PID_FILE ]; then
            PID=$(cat $PID_FILE)
            if ps -p $PID > /dev/null; then
                echo "$SERVICE 正在运行 (PID: $PID)"
            else
                echo "$SERVICE PID文件存在但进程未运行"
            fi
        else
            echo "$SERVICE 未运行"
        fi
        ;;
    *)
        echo "用法: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac