Skip to content

进程管理

进程概述

进程状态

状态说明
IIdle,空闲
RRunning,运行中或就绪
SSleeping,可中断睡眠
DDisk Sleep,不可中断睡眠
TStopped,停止状态
ZZombie,僵尸进程
UUninterruptible Wait

进程优先级

  • 优先级范围:-20 到 20
  • 数值越小优先级越高
  • 默认优先级:0

ps - 查看进程

基本用法

bash
ps                              # 当前终端进程
ps -e                           # 所有进程
ps -A                           # 所有进程
ps aux                          # 详细信息(BSD风格)
ps -ef                          # 详细信息(标准风格)
ps -ax                          # macOS 常用

常用选项

bash
ps -u username                  # 指定用户的进程
ps -p 1234                      # 指定 PID
ps -c                           # 只显示命令名
ps -f                           # 完整格式
ps -l                           # 长格式
ps -o pid,ppid,command,%cpu,%mem    # 自定义输出列
ps -eo pid,ppid,command,%cpu,%mem --sort=-%cpu    # 按CPU排序
ps -eo pid,ppid,command,%cpu,%mem --sort=-%mem    # 按内存排序

输出列说明

说明
PID进程 ID
PPID父进程 ID
USER用户
%CPUCPU 使用率
%MEM内存使用率
VSZ虚拟内存大小
RSS物理内存大小
STAT进程状态
START启动时间
TIMECPU 时间
COMMAND命令

查找进程

bash
ps aux | grep nginx
pgrep nginx                     # 查找进程 PID
pgrep -l nginx                  # 显示进程名
pgrep -u root nginx             # 指定用户
pgrep -P 1234                   # 查找子进程
pidof nginx                     # 查找进程 PID

top - 动态监控

基本用法

bash
top                             # 动态显示进程
top -s 5                        # 5秒刷新
top -n 10                       # 刷新10次后退出
top -p 1234,5678                # 监控指定进程
top -u username                 # 指定用户
top -o cpu                      # 按 CPU 排序
top -o mem                      # 按内存排序
top -l 1                        # 只显示一次(日志模式)
top -l 1 -n 10                  # 显示前10个进程
top -l 1 -o mem -n 10           # 按内存排序显示前10

交互命令

命令功能
h帮助
q退出
k终止进程
r调整优先级
o设置排序列
O选择排序列
n设置显示数量
c显示完整命令
f选择显示字段
S累计时间模式
s设置刷新间隔
Space立即刷新

top 输出说明

Processes: 300 total, 2 running, 298 sleeping, 1016 threads 
2023/12/25 12:00:00
Load Avg: 1.50, 1.30, 1.10 
CPU usage: 5.0% user, 2.0% sys, 93.0% idle 
SharedLibs: 100M resident, 50M data, 0B linkedit.
MemRegions: 50000 total, 2G resident, 50M private, 500M shared.
PhysMem: 8G used (1500M wired), 0B unused.
VM: 500G vsize, 1000M framework vsize, 0(0) swapins, 0(0) swapouts.
Networks: packets: 100000 in, 50000 out.
Disks: 100000 total, 50000 reads, 50000 writes.

htop - 增强版监控

bash
htop                            # 启动 htop
htop -p 1234                    # 监控指定进程
htop -u username                # 指定用户
htop -t                         # 树形显示
htop -s PERCENT_CPU             # 按 CPU 排序
htop -s PERCENT_MEM             # 按内存排序

htop 交互命令

命令功能
F1帮助
F2设置
F3搜索
F4过滤
F5树形视图
F6排序
F7降低优先级
F8提高优先级
F9终止进程
F10退出

kill - 终止进程

信号列表

信号编号说明
SIGHUP1挂起/重新加载配置
SIGINT2中断 (Ctrl+C)
SIGQUIT3退出
SIGKILL9强制终止
SIGTERM15正常终止(默认)
SIGCONT18继续
SIGSTOP19暂停

基本用法

bash
kill 1234                       # 发送 SIGTERM
kill -15 1234                   # 发送 SIGTERM
kill -TERM 1234                 # 发送 SIGTERM
kill -9 1234                    # 强制终止
kill -KILL 1234                 # 强制终止
kill -HUP 1234                  # 重新加载配置
kill -l                         # 列出所有信号

killall - 按名称终止

bash
killall nginx                   # 终止所有 nginx 进程
killall -9 nginx                # 强制终止
killall -u username             # 终止用户所有进程
killall -i nginx                # 交互式确认
killall -w nginx                # 等待进程结束

pkill - 按模式终止

bash
pkill nginx                     # 终止匹配进程
pkill -9 nginx                  # 强制终止
pkill -u username               # 终止用户进程
pkill -f "python script.py"     # 匹配完整命令
pkill -t pts/0                  # 终止终端进程
pkill -P 1234                   # 终止子进程

进程控制

后台运行

bash
command &                       # 后台运行
nohup command &                 # 忽略挂断信号
nohup command > output.log 2>&1 &   # 重定向输出
setsid command                  # 新会话运行
disown %1                       # 从作业列表移除

作业控制

bash
jobs                            # 查看作业
jobs -l                         # 详细信息
Ctrl + Z                        # 暂停当前进程
bg %1                           # 后台继续
fg %1                           # 前台继续
wait %1                         # 等待作业完成
wait $!                         # 等待最后一个后台进程

nice - 启动时设置优先级

bash
nice -n 10 command              # 优先级 10
nice -n -5 command              # 优先级 -5(需要 root)
nice --10 command               # 优先级 -10

renice - 修改运行中进程优先级

bash
renice -n 5 -p 1234             # 修改进程优先级
renice -n 5 -u username         # 修改用户所有进程
renice -n 5 -g groupname        # 修改组所有进程

pstree - 进程树

bash
pstree                          # 显示进程树
pstree -p                       # 显示 PID
pstree -u                       # 显示用户
pstree -h                       # 高亮当前进程
pstree -H 1234                  # 高亮指定进程
pstree -s                       # 显示父进程
pstree -a                       # 显示完整命令
pstree -n                       # 按 PID 排序
pstree 1234                     # 指定进程的子树

launchctl - 服务管理

macOS 使用 launchd 管理服务。

加载和卸载服务

bash
launchctl load ~/Library/LaunchAgents/com.user.script.plist
launchctl unload ~/Library/LaunchAgents/com.user.script.plist
launchctl load -w ~/Library/LaunchAgents/com.user.script.plist  # 加载并启用
launchctl unload -w ~/Library/LaunchAgents/com.user.script.plist  # 卸载并禁用

服务控制

bash
launchctl start com.user.script     # 启动服务
launchctl stop com.user.script      # 停止服务
launchctl restart com.user.script   # 重启服务

查看服务

bash
launchctl list                      # 列出所有服务
launchctl list | grep com.user      # 搜索服务
launchctl print gui/$(id -u)/com.user.script  # 查看服务详情

服务目录

目录说明
~/Library/LaunchAgents用户代理
/Library/LaunchAgents系统代理
/Library/LaunchDaemons系统守护进程
/System/Library/LaunchAgents系统代理(Apple)
/System/Library/LaunchDaemons系统守护进程(Apple)

launchctl 示例 plist

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.script</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/user/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

进程监控工具

vm_stat - 虚拟内存统计

bash
vm_stat                         # 内存统计
vm_stat 1                       # 每秒刷新
vm_stat 1 5                     # 刷新5次

iostat - I/O 统计

bash
iostat                          # I/O 统计
iostat 1                        # 每秒刷新
iostat -c 5                     # 刷新5次
iostat -d disk0                 # 指定磁盘

netstat - 网络统计

bash
netstat                         # 显示连接
netstat -a                      # 显示所有连接
netstat -n                      # 数字形式显示
netstat -p tcp                  # 只显示 TCP
netstat -p udp                  # 只显示 UDP
netstat -r                      # 显示路由表
netstat -s                      # 显示统计
netstat -an                     # 组合使用
netstat -an | grep LISTEN       # 查找监听端口

lsof - 打开文件

bash
lsof                            # 所有打开文件
lsof -p 1234                    # 指定进程
lsof -u username                # 指定用户
lsof -i                         # 网络连接
lsof -i :80                     # 指定端口
lsof -i TCP                     # TCP 连接
lsof -i UDP                     # UDP 连接
lsof /path/to/file              # 打开指定文件
lsof +D /path                   # 目录下打开的文件
lsof -c nginx                   # 指定命令

dtrace - 动态追踪

bash
sudo dtrace -l | head           # 列出探针
sudo dtrace -n 'syscall::open*:entry { trace(copyinstr(arg0)); }'
sudo dtrace -n 'profile-997 { @[ustack(10)] = count(); }'

进程资源限制

ulimit - 资源限制

bash
ulimit -a                       # 查看所有限制
ulimit -n                       # 打开文件数
ulimit -u                       # 用户进程数
ulimit -s                       # 栈大小
ulimit -v                       # 虚拟内存
ulimit -c                       # 核心转储大小
ulimit -f                       # 文件大小

ulimit -n 65535                 # 设置打开文件数
ulimit -c unlimited             # 允许核心转储

sysctl - 系统参数

bash
sysctl -a                       # 查看所有参数
sysctl kern.maxproc             # 最大进程数
sysctl kern.maxfiles            # 最大文件数
sysctl -w kern.maxfiles=65536   # 设置参数(临时)

实用示例

查找并终止进程

bash
ps aux | grep nginx | grep -v grep | awk '{print $2}' | xargs kill
pkill -f "python script.py"
kill $(pgrep -f "node app.js")

监控进程资源

bash
top -l 1 | head -20
ps aux --sort=-%cpu | head -10
ps aux --sort=-%mem | head -10

查找僵尸进程

bash
ps aux | awk '$8 ~ /Z/ {print}'
ps -eo pid,ppid,stat,cmd | grep Z

查看端口占用

bash
lsof -i :80
netstat -an | grep LISTEN | grep 80

下一步学习