Linux进程管理
进程基础概念
在Linux系统中,进程是正在运行的程序实例。每个进程都有唯一的进程ID(PID),并拥有独立的内存空间和系统资源。
进程状态
Linux进程有以下几种状态:
- 运行态(Running):进程正在CPU上执行
- 可中断睡眠态(Interruptible Sleep):进程等待某个事件完成
- 不可中断睡眠态(Uninterruptible Sleep):进程等待硬件I/O操作完成
- 停止态(Stopped):进程被信号停止
- 僵尸态(Zombie):进程已终止但父进程尚未回收其资源
进程类型
- 前台进程:与用户交互的进程
- 后台进程:在后台运行的进程
- 守护进程:系统服务进程,通常在后台运行
查看进程信息
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
故障排除
常见问题
-
僵尸进程:父进程未正确回收子进程资源
# 查找僵尸进程
ps aux | grep -w Z
# 解决方法:重启父进程或手动清理 -
进程挂起:进程无响应
# 查看挂起进程
ps aux | grep -w T
# 恢复进程
kill -CONT PID -
资源耗尽:系统资源不足
# 查看系统资源使用情况
top
free -h
df -h
# 终止占用资源过多的进程
kill -9 PID -
服务无法启动:
# 查看服务日志
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进程管理是系统管理的核心内容之一。通过掌握进程查看、控制、优先级管理和系统监控等技能,可以有效维护系统的稳定运行和性能优化。
关键要点:
- 理解进程的基本概念和状态
- 熟练使用ps、top、htop等进程查看工具
- 掌握进程的启动、停止和优先级调整方法
- 学会使用systemd管理系统服务
- 能够监控系统资源使用情况
- 掌握故障排除的基本方法