Skip to content

用户进程

用户进程是由用户命令、系统服务、脚本、应用程序创建的进程。它们运行在用户空间,通过系统调用请求内核提供文件、网络、内存和进程管理能力。

理解用户进程,重点看四件事:它由谁启动、处于什么状态、占用什么资源、收到信号后如何退出。

生命周期

典型生命周期:

  1. 父进程通过 fork 创建子进程。
  2. 子进程通过 exec 加载新程序。
  3. 进程进入运行、睡眠、等待 I/O 等状态。
  4. 进程收到信号或主动退出。
  5. 父进程回收退出状态。

如果第 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。普通服务通常不需要手动改优先级。需要时可以使用 nicerenice 或实时调度策略,但要谨慎。

优先级调错可能让低价值任务抢占关键服务,甚至影响系统响应。

调试入口

问题常用工具
不知道进程在做什么strace -p PID
文件或端口被谁占用lsof -p PIDlsof -i :PORT
CPU 高top -H、线程堆栈、应用 profiler
内存高/proc/PID/statuspmap、堆转储
进程卡住stracecat /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 等管理器。遇到异常时先观察状态和资源,再决定发送信号、重启服务或继续深入调试。

别急,先让缓存热一下。