Appearance
进程管理
进程概述
进程状态
| 状态 | 说明 |
|---|---|
| I | Idle,空闲 |
| R | Running,运行中或就绪 |
| S | Sleeping,可中断睡眠 |
| D | Disk Sleep,不可中断睡眠 |
| T | Stopped,停止状态 |
| Z | Zombie,僵尸进程 |
| U | Uninterruptible 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 | 用户 |
| %CPU | CPU 使用率 |
| %MEM | 内存使用率 |
| VSZ | 虚拟内存大小 |
| RSS | 物理内存大小 |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | CPU 时间 |
| COMMAND | 命令 |
查找进程
bash
ps aux | grep nginx
pgrep nginx # 查找进程 PID
pgrep -l nginx # 显示进程名
pgrep -u root nginx # 指定用户
pgrep -P 1234 # 查找子进程
pidof nginx # 查找进程 PIDtop - 动态监控
基本用法
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 - 终止进程
信号列表
| 信号 | 编号 | 说明 |
|---|---|---|
| SIGHUP | 1 | 挂起/重新加载配置 |
| SIGINT | 2 | 中断 (Ctrl+C) |
| SIGQUIT | 3 | 退出 |
| SIGKILL | 9 | 强制终止 |
| SIGTERM | 15 | 正常终止(默认) |
| SIGCONT | 18 | 继续 |
| SIGSTOP | 19 | 暂停 |
基本用法
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 # 优先级 -10renice - 修改运行中进程优先级
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