Skip to main content

Linux进程管理

进程基础概念

在Linux系统中,进程是正在运行的程序实例。每个进程都有唯一的进程ID(PID),并拥有独立的内存空间和系统资源。

进程状态

Linux进程有以下几种状态:

  1. 运行态(Running):进程正在CPU上执行
  2. 可中断睡眠态(Interruptible Sleep):进程等待某个事件完成
  3. 不可中断睡眠态(Uninterruptible Sleep):进程等待硬件I/O操作完成
  4. 停止态(Stopped):进程被信号停止
  5. 僵尸态(Zombie):进程已终止但父进程尚未回收其资源

进程类型

  1. 前台进程:与用户交互的进程
  2. 后台进程:在后台运行的进程
  3. 守护进程:系统服务进程,通常在后台运行

查看进程信息

ps命令

ps命令用于显示当前进程的快照信息。

# 显示所有进程的详细信息
ps aux

# 显示完整格式的进程信息
ps -ef

# 显示指定用户的进程
ps -u username

# 显示进程树
ps -ejH

# 显示线程信息
ps -eLf

# 自定义输出格式
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

top命令

top命令提供实时的进程监控界面。

# 启动top
top

# top交互命令:
# q - 退出
# k - 终止进程
# r - 调整进程优先级
# M - 按内存使用排序
# P - 按CPU使用排序
# T - 按运行时间排序
# u - 显示指定用户的进程

htop命令

htop是top的增强版本,提供更友好的界面。

# 安装htop(Ubuntu/Debian)
sudo apt install htop

# 安装htop(CentOS/RHEL)
sudo yum install htop

# 启动htop
htop

其他查看进程命令

# 查看进程树
pstree

# 查看特定进程
pgrep process_name

# 查看进程详细信息
ps -p PID -f

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

进程控制

启动进程

# 前台运行命令
command

# 后台运行命令
command &

# 将前台进程放到后台
# 1. Ctrl+Z 暂停进程
# 2. bg 将进程放到后台继续运行

# 使用nohup在后台持久运行
nohup command &

# 使用screen/tmux会话管理
screen -S session_name
# 或
tmux new -s session_name

进程前后台切换

# 查看后台作业
jobs

# 将作业切换到前台
fg %job_number

# 在后台继续运行作业
bg %job_number

# 将运行中的进程放到后台
# Ctrl+Z 暂停进程,然后使用bg命令

终止进程

# 终止指定PID的进程
kill PID

# 强制终止进程
kill -9 PID

# 终止指定名称的所有进程
killall process_name

# 使用pkill按名称终止进程
pkill process_name

# 使用killall5终止所有进程(谨慎使用)
sudo killall5

进程优先级管理

nice值

Linux使用nice值来确定进程的优先级,范围从-20(最高优先级)到19(最低优先级)。

# 以指定nice值启动进程
nice -n 10 command

# 查看进程nice值
ps -eo pid,ni,comm

# 修改运行中进程的nice值
renice 5 PID

# 修改用户所有进程的nice值
renice 5 -u username

实时优先级

# 查看实时优先级
ps -eo pid,ni,pri,rtprio,comm

# 设置实时优先级(需要root权限)
chrt -f 50 command

系统资源监控

CPU使用情况

# 实时查看CPU使用情况
top

# 查看CPU详细信息
lscpu

# 查看CPU使用统计
vmstat 1 5

# 查看每个CPU核心的使用情况
mpstat -P ALL 1 5

内存使用情况

# 查看内存使用情况
free -h

# 查看详细内存信息
cat /proc/meminfo

# 实时监控内存使用
watch -n 1 free -h

# 查看进程内存使用
ps aux --sort=-%mem | head -10

磁盘I/O监控

# 查看磁盘I/O统计
iostat -x 1 5

# 实时监控磁盘使用
iotop

# 查看进程I/O使用情况
pidstat -d 1 5

网络监控

# 查看网络连接
netstat -tuln

# 查看网络统计
ss -tuln

# 实时监控网络流量
iftop

# 查看进程网络使用
nethogs

系统性能分析

uptime命令

# 查看系统负载平均值
uptime

# 输出示例:14:28:15 up 2 days, 3:15, 2 users, load average: 0.15, 0.25, 0.30
# 三个数字分别表示1分钟、5分钟、15分钟的平均负载

sar命令

# 安装sysstat包
sudo apt install sysstat

# 查看CPU使用情况历史数据
sar -u

# 查看内存使用情况历史数据
sar -r

# 查看网络统计历史数据
sar -n DEV

# 实时监控
sar -u 1 5

其他性能工具

# 系统性能概览
dstat

# 进程跟踪
strace command

# 系统调用统计
strace -c command

# 查看系统限制
ulimit -a

守护进程管理

systemd服务管理

现代Linux发行版使用systemd作为初始化系统和服务管理器。

# 启动服务
sudo systemctl start service_name

# 停止服务
sudo systemctl stop service_name

# 重启服务
sudo systemctl restart service_name

# 查看服务状态
sudo systemctl status service_name

# 设置服务开机自启
sudo systemctl enable service_name

# 禁止服务开机自启
sudo systemctl disable service_name

# 查看所有服务
sudo systemctl list-units --type=service

# 查看开机自启服务
sudo systemctl list-unit-files --type=service

传统init系统

一些较老的系统仍然使用SysV init或Upstart。

# SysV init命令
sudo service service_name start
sudo service service_name stop
sudo service service_name restart
sudo service service_name status

# 查看运行级别
runlevel

# 切换运行级别
sudo init 3

进程间通信(IPC)

信号

信号是进程间通信的一种方式,用于通知进程发生了特定事件。

# 常用信号
# SIGTERM (15) - 终止信号(默认)
# SIGKILL (9) - 强制终止信号
# SIGSTOP (19) - 停止信号
# SIGCONT (18) - 继续信号

# 发送信号
kill -SIGTERM PID
kill -15 PID

# 发送SIGKILL信号
kill -9 PID

# 挂起进程
kill -STOP PID

# 恢复进程
kill -CONT PID

其他IPC机制

# 查看系统IPC资源
ipcs

# 查看消息队列
ipcs -q

# 查看共享内存
ipcs -m

# 查看信号量
ipcs -s

# 删除IPC资源
ipcrm -q queue_id
ipcrm -m shm_id
ipcrm -s sem_id

实践练习

练习1:进程监控和管理

# 1. 启动几个测试进程
sleep 300 &
nano test.txt &
top &

# 2. 查看后台作业
jobs

# 3. 查看所有进程
ps aux | grep sleep
ps aux | grep nano

# 4. 将前台进程放到后台
# 打开一个新的终端窗口执行以下命令
# fg %2 # 将nano切换到前台
# Ctrl+Z # 暂停nano
# bg # 在后台继续运行nano

# 5. 终止进程
kill %1 # 终止sleep进程
pkill nano # 终止nano进程

练习2:优先级管理

# 1. 以低优先级启动进程
nice -n 15 yes > /dev/null &

# 2. 查看进程优先级
ps -eo pid,ni,comm | grep yes

# 3. 调整运行中进程的优先级
renice -5 PID

# 4. 验证优先级更改
ps -eo pid,ni,comm | grep yes

练习3:系统性能监控

# 1. 实时监控系统资源
top

# 2. 查看内存使用情况
free -h

# 3. 查看磁盘I/O
iostat -x 1 5

# 4. 查看网络连接
ss -tuln

# 5. 查看系统负载
uptime

练习4:服务管理

# 1. 查看SSH服务状态
sudo systemctl status ssh

# 2. 启动/停止SSH服务
sudo systemctl start ssh
sudo systemctl stop ssh

# 3. 重启SSH服务
sudo systemctl restart ssh

# 4. 设置SSH服务开机自启
sudo systemctl enable ssh

# 5. 查看所有服务状态
sudo systemctl list-units --type=service --state=running

故障排除

常见问题

  1. 僵尸进程:父进程未正确回收子进程资源

    # 查找僵尸进程
    ps aux | grep -w Z

    # 解决方法:重启父进程或手动清理
  2. 进程挂起:进程无响应

    # 查看挂起进程
    ps aux | grep -w T

    # 恢复进程
    kill -CONT PID
  3. 资源耗尽:系统资源不足

    # 查看系统资源使用情况
    top
    free -h
    df -h

    # 终止占用资源过多的进程
    kill -9 PID
  4. 服务无法启动

    # 查看服务日志
    sudo journalctl -u service_name

    # 检查配置文件
    sudo systemctl status service_name

监控脚本示例

#!/bin/bash
# 简单的系统监控脚本

echo "=== 系统监控报告 ==="
echo "时间: $(date)"
echo "负载: $(uptime | awk -F'load average:' '{print $2}')"
echo "内存使用:"
free -h
echo "磁盘使用:"
df -h
echo "CPU使用最高的进程:"
ps aux --sort=-%cpu | head -5
echo "内存使用最高的进程:"
ps aux --sort=-%mem | head -5

总结

Linux进程管理是系统管理的核心内容之一。通过掌握进程查看、控制、优先级管理和系统监控等技能,可以有效维护系统的稳定运行和性能优化。

关键要点:

  1. 理解进程的基本概念和状态
  2. 熟练使用ps、top、htop等进程查看工具
  3. 掌握进程的启动、停止和优先级调整方法
  4. 学会使用systemd管理系统服务
  5. 能够监控系统资源使用情况
  6. 掌握故障排除的基本方法