Linux 进程管理实战:ps、top、kill 与 nohup 后台运行


服务器卡了不知道哪个进程在吃资源、脚本跑一半想停掉、SSH 一断开程序就跟着退出——这些都要靠进程管理解决。进程是 Linux 里"正在运行的程序",管理好进程,服务器就不会乱。这篇文章把最常用的 ps、top、kill 和 nohup 讲清楚。

一、查看进程:ps

ps 是静态快照,最常用的组合是 ps aux 和 ps -ef:

ps aux                    # 查看所有进程
ps aux | grep nginx       # 只看某个程序(配合 grep)
ps -ef                    # 另一种格式
ps aux --sort=-%mem       # 按内存占用排序
ps aux --sort=-%cpu | head -n 10   # CPU 占用前十

ps aux 输出字段含义:

USER   PID  %CPU %MEM  VSZ  RSS TTY STAT START TIME COMMAND
root  1234  0.3  1.2 ... ... ?   S    09:00 0:01 /usr/sbin/nginx
  • USER 运行用户;PID 进程号;%CPU/%MEM 占用;STAT 状态(S 睡眠、R 运行、Z 僵尸、T 停止);
  • COMMAND 完整命令(能看到运行参数)。

二、动态监控:top / htop

top 实时刷新,按 q 退出:

top                      # 进入实时监控界面
top -o %MEM              # 直接按内存排序
top -p 1234              # 只看指定 PID

top 界面里常用按键:1 看每个核心、M 按内存排序、P 按 CPU 排序、k 杀掉进程、q 退出。有 htop 的系统用 htop 更直观,方向键选择进程、F9 杀进程。

三、结束进程:kill / pkill / killall

kill 1234                     # 默认发送 TERM 信号,优雅终止
kill -9 1234                  # 强制杀死(SIGKILL)
pkill -f "php-fpm"            # 按命令名匹配终止
pkill -u zhangsan             # 终止某用户的所有进程
killall nginx                 # 按完整进程名终止

信号说明:

信号 编号 作用
TERM 15 默认信号,请求进程正常退出
KILL 9 强制杀死,无法被拦截
HUP 1 重载配置(如 kill -HUP nginx_pid)
STOP 19 暂停进程(kill -CONT 恢复)

顺序建议:先 kill(TERM)给进程收拾的机会,没反应再 kill -9。直接 -9 可能造成数据未落盘或配置未保存。

查 PID 再杀:

pidof nginx               # 直接输出 nginx 的 PID
pgrep -f "python app.py"  # 按完整命令行找 PID
kill $(pgrep -f "python app.py")

四、后台运行:nohup 与 &

问题:SSH 断开后,前台启动的程序会收到 SIGHUP 信号退出。用 nohup 忽略挂断信号:

nohup python app.py > app.log 2>&1 &
  • nohup 忽略挂断信号;& 放后台;> app.log 2>&1 把输出和错误都写进日志;
  • 标准写法:nohup 命令 > 日志 2>&1 &,日志必加,否则输出到 nohup.out。

查看后台任务:

jobs                # 查看当前终端的后台任务
fg %1               # 把任务 1 调回前台
bg %1               # 暂停的任务放后台继续

注意:jobs 只对当前终端有效,SSH 断了就看不到。要管理长期后台进程,推荐 systemd 服务或 screen/tmux。

五、完整场景:一条命令搞定"起停查杀"

1. 程序跑起来 + 后台 + 记录日志

cd /opt/myapp && nohup ./server > server.log 2>&1 &
echo $!              # 输出刚启动的 PID

2. 按端口找到进程并停止(如 8080)

ss -tlnp | grep 8080                 # 查看端口被哪个 PID 占用
kill $(ss -tlnp | grep 8080 | grep -oE 'pid=[0-9]+' | cut -d= -f2)

3. 进程变僵尸(STAT=Z)

僵尸进程本身占资源很少,但父进程不回收会堆积。找到父进程 PPID:ps -o pid,ppid,stat,cmd | grep Z,杀掉或重启父进程即可。

4. 系统太卡,找出元凶

top -b -n 1 | head -n 20      # 一次性输出快照
ps aux --sort=-%cpu | head -n 5

六、常见坑

  1. kill 无效:进程处于 D 状态(不可中断睡眠,多为 IO 卡死)连 -9 也杀不掉,只能等或重启机器;
  2. kill -9 的代价:MySQL/Redis 这类先 TERM 再 KILL,直接 -9 可能损坏数据;
  3. nohup 后程序还是退出:检查日志,可能是程序自身崩溃,不是信号问题;nohup 只忽略 HUP 信号;
  4. 误杀:pkill -u root 这种操作极危险,会杀掉 root 所有进程,务必确认匹配范围;
  5. 权限:非 root 用户只能杀自己的进程,杀别人进程提示 Operation not permitted。

总结:进程管理记四件事——ps aux 看现状、top 看实时、kill 停进程、nohup + & 保后台。杀进程先 TERM 后 KILL,后台任务必带日志,长期运行的程序交给 systemd。掌握这套组合拳,日常运维的"起停查杀"就全搞定了。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Linux 环境变量详解:PATH、export、.bashrc 与常见坑

Linux 用户与用户组管理:useradd、groupadd、passwd 与权限隔离

评 论
更换验证码