Linux 进程管理与监控——ps/top/htop/kill/systemctl Linux 进程管理与监控——ps/top/htop/kill/systemctl提示本文所有命令在 Ubuntu 22.04 / Debian 12 / Fedora 38 / Arch Linux 下验证。一、进程是什么程序是磁盘上的文件进程是程序运行起来之后在内存里的实体。每个进程有一个唯一编号叫PID****Process ID。进程的关键属性属性说明PID进程 ID唯一标识PPID父进程 ID谁启动了它UID/USER哪个用户在跑%CPUCPU 占用百分比%MEM内存占用百分比VSZ虚拟内存大小KBRSS实际占用物理内存KBSTAT进程状态见下表COMMAND启动命令进程状态码状态码含义RRunning正在运行或可运行SSleeping等待事件常见DDisk Sleep不可中断睡眠这种状态无法被 kill -9 杀掉只能等 IO 完成或重启系统。TStopped被暂停CtrlZZZombie僵尸进程已退出但未被父进程回收IIdle空闲内核线程提示状态码后面跟 表示高优先级N 表示低优先级s 表示会话领导l 表示多线程 表示前台进程组。二、ps——查看进程快照psProcess Status输出的是某一时刻的进程列表不会动态更新。常用组合# 查看当前终端的进程ps# 查看所有用户的所有进程常用ps aux# 树形显示父子关系ps auxf# 只看某个用户的进程ps -u fqy0610# 只看某个名字的进程模糊匹配ps aux | grep nginx# 找进程 PID[n] 让 grep 匹配 nginx 但不匹配自身不显示 grep 自身ps aux | grep ‘[n]ginx’ps aux各列含义USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 168700 11800 ? Ss Jun28 0:04 /sbin/init列说明USER运行该进程的用户PID进程 ID%CPUCPU 使用率%MEM内存使用率VSZ虚拟内存KBRSS物理内存KBTTY关联的终端? 表示无终端后台服务STAT进程状态START启动时间TIME累计 CPU 时间COMMAND命令及参数如果 RSS 持续增长可能说明有内存泄漏。pgrep和 pstree# 只返回 PID不需要 grep 过滤pgrep nginxpgrep -u root sshd # 指定用户# 树形显示更清晰pstreepstree -p # 显示 PIDpstree -u # 显示用户名三、top——实时进程监控top 是内置的实时监控工具每 3 秒自动刷新。toptop -u fqy0610 # 只显示某用户的进程top -p 1234,5678 # 只监控指定 PIDtop界面解读top - 11:22:08 up 2 days, 3:14, 2 users, load average: 0.52, 0.48, 0.43Tasks: 312 total, 1 running, 311 sleeping, 0 stopped, 0 zombie%Cpu(s): 2.3 us, 0.8 sy, 0.0 ni, 96.5 id, 0.3 wa, 0.0 hi, 0.1 siMiB Mem : 15940.5 total, 4210.3 free, 8320.1 used, 3410.1 buff/cacheMiB Swap: 2048.0 total, 1848.2 free, 199.8 used. 6890.4 avail Mem字段含义load average1/5/15 分钟平均负载超过 CPU 核数就说明有排队对于单核负载 1 正常对于 8 核负载 8 正常。us用户空间 CPU 时间sy内核空间 CPU 时间waIO 等待高说明磁盘是瓶颈id空闲越高越轻松buff/cache文件缓存系统会自动回收top交互快捷键按键作用q退出1展开显示每个 CPU 核的使用率M按内存使用率排序P按 CPU 使用率排序默认T按累计 CPU 时间排序k输入 PID 发送信号杀进程r输入 PID 调整优先级renicef选择显示哪些列u过滤显示某用户的进程H切换显示线程d修改刷新间隔ShiftW保存配置到 ~/.toprc四、htop——更好用的 tophtop 是 top 的增强版彩色界面支持鼠标点击功能更强。# 安装sudo apt install htop # Debian/Ubuntusudo dnf install htop # Fedora/RHELsudo pacman -S htop # Arch# 启动htophtop界面优势·彩色进度条CPU、内存使用一目了然·鼠标支持点击列名排序点击进程选中·树形视图F5 切换进程树·搜索过滤/ 搜索\ 过滤·多选操作Space 标记多个进程htop常用快捷键按键作用F1帮助F2设置颜色/显示列/CPU meter 样式F3 / /搜索进程名F4过滤只显示匹配的进程F5树形视图切换F6选择排序列F9发送信号图形化 killF10 / q退出u过滤用户Space标记/取消标记进程k发送信号给选中进程提示htop 的 F2 → Display options → Tree view 可以设置默认启动就是树形视图比 top 更直观。不同版本菜单位置可能略有不同搜索 Tree view 选项即可。五、kill——向进程发送信号kill 不只是杀进程准确说是向进程发送信号进程可以选择响应方式。常用信号信号编号信号名含义能被忽略1SIGHUP重新加载配置不重启进程能2SIGINT中断等同于 CtrlC能9SIGKILL强制立即终止不能15SIGTERM优雅终止默认能18SIGCONT继续运行恢复暂停的进程—19SIGSTOP暂停进程等同于 CtrlZ不能** kill -9 是最强手段但也最危险优先用kill -15。**# 默认发送 SIGTERM优雅退出kill 1234# 强制杀死进程无法忽略kill -9 1234kill -SIGKILL 1234# 让进程重新加载配置nginx/sshd 常用kill -1 1234kill -HUP 1234# 按进程名发送信号不需要先查 PIDpkill nginxpkill -9 firefoxpkill -HUP sshd# 向某用户的所有进程发送信号pkill -u testuser# killall按精确名字匹配killall nginxkillall -9 chrome⚠️注意优先用 kill -15SIGTERM给进程机会做清理工作关文件、写日志、释放锁。只有在进程无响应时才用 kill -9后者不给进程任何收尾机会。查 PID 再杀的完整流程# 方法一ps grep killps aux | grep nginxkill 12345# 方法二pgrep kill一步到位kill $(pgrep nginx)# 方法三pkill简洁pkill nginx六、nice 和renice——进程优先级Linux 用nice值控制进程的 CPU 调度优先级·范围-20最高优先级到 19最低优先级·默认值0·普通用户只能调高 nice 值降低优先级调低 nice 值提高优先级需要 root# 以低优先级启动nice 值 10让其他任务优先nice -n 10 python backup.py# 以高优先级启动需要 rootsudo nice -n -5 ./important_task.sh# 调整正在运行进程的优先级renice -n 15 -p 1234 # 把 PID 1234 调低优先级sudo renice -n -5 -p 1234 # 提高优先级需要 root# 按进程名批量调整renice -n 10 -u fqy0610 # 调低某用户所有进程的优先级实用场景跑耗时的编译任务、数据处理脚本时用 nice -n 19 启动让它在后台慢慢跑不影响前台操作的流畅度。七、systemctl——管理系统服务系统服务比如 SSH、Nginx、MySQL由systemd统一管理systemctl 是操控 systemd 的命令。基础操作# 查看服务状态常用systemctl status nginxsystemctl status sshd# 启动/停止/重启sudo systemctl start nginxsudo systemctl stop nginxsudo systemctl restart nginx# 如果服务启动失败systemctl status 会显示红色 failed 和最后几行错误日志。# 重新加载配置不重启进程sudo systemctl reload nginx# 开机自启/禁用自启sudo systemctl enable nginxsudo systemctl disable nginx# 同时启动并设置开机自启sudo systemctl enable --now nginx# 强制立即终止相当于 kill -9sudo systemctl kill nginx# systemctl kill 默认发送 SIGTERM可以用 --signal 指定其他信号。查看服务信息# 列出所有正在运行的服务systemctl list-units --typeservice --staterunning# 列出所有服务包括未运行的systemctl list-units --typeservice --all# 查看开机自启状态systemctl is-enabled nginx# 查看服务的日志journalctl -u nginxjournalctl -u nginx -f # 实时跟踪journalctl -u nginx --since “1 hour ago”journalctl -u nginx -n 50 # 最近 50 行服务状态含义状态说明active (running)正在运行active (exited)已完成一次性任务inactive (dead)未运行failed启动失败activating正在启动常用服务名参考服务常用名SSH 服务ssh 或 sshdNginxnginxApacheapache2Debian/ httpdRHELMySQLmysql 或 mysqldPostgreSQLpostgresqlDockerdocker防火墙 UFWufw蓝牙bluetooth网络管理NetworkManager如果不知道服务名用 systemctl list-units --typeservice 列出所有服务。八、后台运行与 nohup前台和后台# 正常启动前台运行终端被占用python server.py# 在后台启动加 python server.py # 把前台进程推到后台先 CtrlZ 暂停再 bg 继续python server.py# CtrlZbg# 把后台进程拉回前台fgfg %1 # 指定 job 编号# 查看后台任务列表jobsjobs -l # 显示 PID**nohup——**关闭终端后继续跑普通后台进程在关掉终端或 SSH 断线后会收到 SIGHUP 信号而退出。nohup 让进程忽略这个信号# 关掉终端也不停nohup python server.py # 输出重定向nohup 不会自动把进程设为后台必须加 默认输出到 nohup.outnohup python server.py server.log 21 # 查看是否还在运行ps aux | grep server.py# 找到 PID 后停止kill $(pgrep -f server.py)提示如果要长期跑后台服务推荐用 systemctl上面第七节或 screen/tmux 管理会话比 nohup 更可控、更好排查。九、实战排查CPU/内存跑满怎么办场景一CPU 突然 100%# 第一步看谁在占 CPUtop # 默认按 CPU 排序# 或者ps aux --sort-%cpu | head -10# 第二步确认是哪个进程ps aux | grep# 第三步看这个进程在干什么ls -l /proc//exe # 查可执行文件路径cat /proc//cmdline | tr ‘\0’ ’ # 查完整命令行lsof -p | head -20 # 查打开的文件# 第四步决定是等待、降优先级还是杀掉renice -n 19 -p # 先降优先级给系统喘息机会kill -15 # 确认要停则优雅终止场景二内存不够用OOM# 查内存占用 Top 10ps aux --sort-%mem | head -10# 查系统内存概览free -h# 查 OOM Killer 有没有杀过进程内核日志sudo dmesg | grep -i “killed process”sudo journalctl -k | grep -i oom# 查 /proc/meminfo 详情cat /proc/meminfo | grep -E “MemTotal|MemFree|MemAvailable|Cached”场景三僵尸进程Zombie僵尸进程已经退出但父进程没有调用wait() 回收进程表里留了个空壳。僵尸进程本身不占 CPU 和内存但占用 PID 表条目大量僵尸会导致 PID 耗尽。# 查僵尸进程ps aux | grep Zps aux | awk ‘$8 “Z”’# 找父进程ps -o ppid -p 僵尸PID # 返回父进程 PIDps aux | grep# 杀父进程父进程退出后僵尸会被 init 回收# 如果父进程是 systemd 管理的服务可以 systemctl restart 服务 来清理。kill -9⚠️注意不要直接 kill -9 僵尸进程僵尸进程已经死了kill 无效。正确方式是通知kill -17或重启父进程让父进程回收它。十、实用工具补充以下工具在日常排查中非常有用按需了解。**vmstat——**系统资源概览vmstat 2 5 # 每 2 秒报告一次共 5 次字段含义r运行队列长度超过 CPU 核数说明有积压b等待 IO 的进程数si/soswap 换入/换出频繁则内存严重不足bi/bo磁盘读/写块数高说明 IO 压力大waCPU 等待 IO 的比例**lsof——**查进程打开了什么文件# 某进程打开的所有文件lsof 是排查端口冲突的首选工具lsof -p 1234# 谁在占用某个端口sudo lsof -i :8080sudo lsof -i :80 -i :443# 谁在用某个文件卸载磁盘前很有用lsof /var/log/syslog# 某用户打开的文件lsof -u fqy0610**strace——**跟踪进程系统调用排查神器[#strace](javascript: 输出可能很密集查看网络相关调用strace -e tracenetwork -p 1234# 跟踪进程在调用什么系统调用strace -p 1234# 只显示文件相关调用strace -e tracefile -p 1234# 启动程序并跟踪strace python script.py# 如果只想让某个程序运行一段时间后自动停止timeout 60s python script.py# watch 可以定时执行命令并刷新输出适合监控某个特定进程的状态变化watch -n 2 “ps aux | grep nginx”# 如果某个程序经常失控可以限制其 CPU 运行时间不超过 60 秒ulimit -t 60提示strace 对排查程序卡死/不响应很有用能看到进程到底在等什么文件锁、网络请求、信号等。十一、速查表进程查看命令作用ps aux查所有进程快照ps auxf树形显示pgrep nginx按名字找 PIDpstree -p进程树显示 PIDtop实时监控内置htop实时监控增强版进程控制命令作用kill优雅终止SIGTERMkill -9强制终止SIGKILLkill -1重载配置SIGHUPpkill按名终止nice -n 10 cmd低优先级启动renice -n 10 -p调整运行中进程优先级后台运行命令作用cmd 后台运行CtrlZ暂停bg继续在后台运行fg拉回前台jobs查看后台任务列表nohup cmd 关终端不停止systemctl服务管理命令作用systemctl status查状态systemctl start/stop/restart启停重启systemctl enable --now启动并开机自启journalctl -u -f实时查日志提示如果记不住所有命令先记住这三条htop 看资源、kill 停进程、systemctl管服务。小结场景推荐工具快速查谁在占 CPU/内存htop彩色直观或 top找某个服务的 PIDpgrep nginx优雅停止进程kill 或 pkill强制终止卡死进程kill -9管理系统服务systemctl搭配 journalctl 查日志排查端口被谁占用sudo lsof -i :后台跑不间断的任务nohup cmd 或 写成 systemd service