Appearance
用户进程
用户进程是由用户命令、系统服务、脚本、应用程序创建的进程。它们运行在用户空间,通过系统调用请求内核提供文件、网络、内存和进程管理能力。
理解用户进程,重点看四件事:它由谁启动、处于什么状态、占用什么资源、收到信号后如何退出。
生命周期
典型生命周期:
- 父进程通过
fork创建子进程。 - 子进程通过
exec加载新程序。 - 进程进入运行、睡眠、等待 I/O 等状态。
- 进程收到信号或主动退出。
- 父进程回收退出状态。
如果第 5 步没有发生,就可能出现僵尸进程。
观察进程
bash
ps -ef
ps aux --sort=-%cpu | head
pstree -ap
top读输出时重点看:
PID:进程 ID。PPID:父进程 ID。STAT:进程状态。%CPU、%MEM:资源占用。COMMAND:启动命令。
信号
信号是进程间和系统向进程发送通知的机制。
| 信号 | 常见用途 |
|---|---|
SIGTERM | 请求进程优雅退出 |
SIGKILL | 强制终止,进程无法捕获 |
SIGHUP | 常用于重新加载配置 |
SIGSTOP | 暂停进程 |
SIGCONT | 继续运行暂停的进程 |
优先使用 SIGTERM,确认进程无法正常退出时再考虑 SIGKILL。直接 kill -9 会跳过清理逻辑,可能导致临时文件、锁、连接和数据状态不完整。
后台任务
Shell 中的后台任务适合临时执行,不适合长期服务。
bash
command &
nohup command > app.log 2>&1 &
jobs
fg %1长期运行的服务应交给 systemd、supervisor、容器编排或进程管理器,而不是长期依赖一个 shell 会话。
资源限制
进程能使用的资源可以被限制:
bash
ulimit -a
cat /proc/PID/limits常见限制:
- 最大打开文件数。
- 最大进程数。
- 栈大小。
- core 文件大小。
连接数很高的服务如果报 “too many open files”,通常要同时检查 systemd unit、shell 限制和应用自身配置。
调度和优先级
Linux 会调度进程使用 CPU。普通服务通常不需要手动改优先级。需要时可以使用 nice、renice 或实时调度策略,但要谨慎。
优先级调错可能让低价值任务抢占关键服务,甚至影响系统响应。
调试入口
| 问题 | 常用工具 |
|---|---|
| 不知道进程在做什么 | strace -p PID |
| 文件或端口被谁占用 | lsof -p PID、lsof -i :PORT |
| CPU 高 | top -H、线程堆栈、应用 profiler |
| 内存高 | /proc/PID/status、pmap、堆转储 |
| 进程卡住 | strace、cat /proc/PID/stack、日志 |
生产环境使用调试工具要注意开销。strace、profiler、堆转储都可能影响进程性能。
常见问题
进程杀不掉
如果状态是 D,说明进程处于不可中断睡眠,通常在等待内核 I/O。kill -9 也不能立即生效。应查磁盘、网络文件系统、块设备、驱动或内核日志。
端口被占用
bash
ss -lntp | grep ':8080'
lsof -i :8080确认进程后,不要急着 kill。先判断它是不是 systemd 管理的服务,避免被自动拉起或影响线上流量。
僵尸进程越来越多
查父进程:
bash
ps -eo stat,ppid,pid,cmd | grep '^Z'处理父进程逻辑或重启父服务。僵尸子进程本身已经退出,无法直接释放。
总结
用户进程排查要围绕父子关系、状态、资源和信号展开。临时命令可以用 shell 管理,长期服务应交给 systemd 等管理器。遇到异常时先观察状态和资源,再决定发送信号、重启服务或继续深入调试。
