Linux进程管理:htop/ps/kill/nice

2632 字
13 分钟
Linux进程管理:htop/ps/kill/nice

进程管理是 Linux 服务器运维的基本功。常见问题:服务器响应变慢不知道怎么排查、误杀进程导致计算白费、不知道如何调整进程优先级。本文覆盖 ps/htop 监控、kill 信号选择、nice/renice 优先级调整、后台进程管理。

实测环境:Debian 12,8核8GB RAM。

1. 查看进程——知道谁在跑、跑了多少#

1.1 ps——经典但繁琐#

Terminal window
# 查看当前用户的所有进程
ps aux | grep $USER
# 只看某个软件
ps aux | grep bwa
# 树状显示父子关系
ps auxf
# 按内存占用排序
ps aux --sort=-%mem | head -20
# 按 CPU 占用排序
ps aux --sort=-%cpu | head -20

ps aux 各列含义:

含义生信关注点
PID进程IDkill 的时候用
%CPUCPU占用率超过100%表示用了多核
%MEM内存占用率快满时要注意
VSZ虚拟内存( KB)BWA 比对时通常很大
RSS物理内存( KB)实际吃掉的物理内存
STAT进程状态R=运行, S=睡眠, Z=僵尸
START启动时间跑了多久
TIME累计CPU时间判断计算是否在推进
COMMAND命令行区分不同任务

1.2 htop——更直观的进程监控#

Terminal window
# 安装
sudo apt install htop -y
# 启动
htop

htop 比 ps 好在:彩色界面、实时刷新、鼠标可点击、可以按 F6 排序、F9 直接 kill。我一般跑长任务时在 tmux 的一个窗格开 htop,随时看资源占用。

需要关注的 htop 指标:

  • CPU 使用率条:绿色是 normal,红色是 kernel 占用——如果红色很多说明 I/O 等待严重
  • Mem 条:绿色是已用,蓝色是 buffers,黄色是 cache——Linux 会尽可能用空闲内存做缓存,Mem 条”满”不一定有问题
  • Load average:1分钟/5分钟/15分钟平均负载。值 > CPU 核数说明有任务在排队——服务器在超负荷运转
Terminal window
# 单核机器 Load average = 1.0 表示 CPU 刚好跑满
# 8核机器 Load average = 8.0 才算跑满
# Load average = 16 且核数=8 → 有一半的任务在排队,CPU 不够用了

1.3 其他实用查看工具#

Terminal window
# 查看进程树(谁启动了谁)
pstree -p
# 查看某个进程的详细信息
cat /proc/PID/status
cat /proc/PID/cmdline
# 查看进程打开了哪些文件(排查"文件被占用"问题)
lsof -p PID
# 实时进程监控(比 htop 更轻量)
top -u $USER

2. 终止进程——kill 不是只有 -9#

2.1 信号类型#

Terminal window
# 列出所有信号
kill -l

生信最常用的几个:

信号编号信号名效果什么时候用
1SIGHUP挂断重新加载配置文件
2SIGINT中断(Ctrl+C)正常停止前台程序
9SIGKILL强制杀死最后手段——程序怎么都不退
15SIGTERM优雅终止(默认)正常停止进程,程序有机会清理
18SIGCONT继续恢复被暂停的进程
19SIGSTOP暂停(不可捕获)强制暂停

2.2 正确的 kill 姿势#

Terminal window
# 先优雅终止(给程序机会保存状态、删除临时文件)
kill 12345
# 等价于 kill -15 12345
# 等几秒,如果还没退
sleep 5
# 再强制杀死(最后手段)
kill -9 12345

kill -9(SIGKILL)不会给进程任何清理机会——临时文件不会删、数据可能还在缓冲区没写入磁盘。但这个命令又是最常敲的,因为跑飞了的流程有时就是怎么都停不下来。

一个原则:永远先用 kill(不带参数,默认 SIGTERM),不行再 kill -9 对比对和组装这种计算密集型程序,SIGTERM 通常足够;挂死的 Python 脚本有时候需要 kill -9

2.3 批量管理#

Terminal window
# 杀所有 bwa 进程
pkill bwa
# 或
killall bwa
# 更精确:只杀某个用户的 bwa
pkill -u bioinfo bwa
# 按进程名模式杀
pkill -f "python pipeline.py"
# 杀某个时间段内启动的所有进程(慎用!)
ps aux | grep "fastp" | awk '{print $2}' | xargs kill

pkillkillall 前一定确认好——pkill bwa 会把所有用户的 bwa 都杀了。

3. 后台运行——关了终端任务也不停#

3.1 nohup——经典方案#

Terminal window
# 后台运行,输出写到 nohup.out
nohup bwa mem -t 8 ref.fa r1.fq r2.fq > sample.sam 2>&1 &
# 查看后台任务
jobs
# 把前台任务转到后台
# 先 Ctrl+Z 暂停,然后
bg

nohup 让进程忽略 SIGHUP 信号(终端关闭时发出的信号)。& 让进程在后台启动。

3.2 disown——补救措施#

如果忘了 nohup,已经在前台跑了一个长任务:

Terminal window
# 1. 先 Ctrl+Z 暂停
# 2. bg 放入后台
bg
# 3. disown 解除和终端的关联
disown -h %1
# 现在关终端也不会杀这个进程

3.3 tmux——最佳实践#

nohup 的致命缺点:一旦启动你就看不到输出了,也不能交互。tmux 解决了这个问题:

Terminal window
# 创建新会话
tmux new -s pipeline
# 在 tmux 里跑任务
bwa mem -t 8 ref.fa r1.fq r2.fq > sample.sam
# Ctrl+B 然后 D → 分离会话,任务继续跑
# 关终端、回家、第二天来
# 重连
tmux attach -t pipeline
# 看到任务已经跑完了,输出都在

建议:长任务必须跑在 tmux/screen 里。 不怕一万就怕 SSH 断线。

4. 进程优先级——nice/renice#

服务器是共享资源,你的 BWA 比对不应该让其他同学的 R 都跑不动。

4.1 优先级基础#

Linux 优先级范围:-20(最高优先级)到 19(最低优先级)。默认是 0。数字越大越”nice”(谦让),优先级越低。

priority=20+nice_valuepriority = 20 + nice\_value

nice 值 -20 → priority 0(最高),nice 值 19 → priority 39(最低)。

4.2 启动时设优先级#

Terminal window
# 以较低的优先级启动(不抢别人资源)
nice -n 10 bwa mem -t 8 ref.fa r1.fq r2.fq > sample.sam
# 以较高优先级启动(需要 sudo)
sudo nice -n -10 important_task.sh

4.3 运行时调整优先级#

Terminal window
# 查看进程的 nice 值
ps -eo pid,ni,comm | grep bwa
# 降低已运行进程的优先级(让它谦让)
renice -n 10 -p 12345
# 提高优先级(需要 sudo)
sudo renice -n -5 -p 12345

生信场景: 你在白天做交互式分析(RStudio、Jupyter),同时后台跑大批量比对。给批量比对设 nice -n 10,降低其 CPU 争抢,确保 RStudio 响应流畅。晚上离开时再 renice -n 0 恢复正常。

4.4 ionice——磁盘 I/O 优先级#

CPU 不是唯一瓶颈,磁盘 I/O 也能拖慢别人:

Terminal window
# 查看 ionice
ionice -p 12345
# 降低 I/O 优先级(idle 级别——只在没人用磁盘时才读)
ionice -c 3 -p 12345

类别:1=实时,2=尽力(默认),3=空闲。当你的批量比对在读参考基因组时会大量读盘,设成 -c 3 不会影响别人的交互操作。

5. 综合实战——进程管理流程#

场景:你需要在服务器上跑 20 个样本的 RNA-seq 流程#

Terminal window
# 1. 创建 tmux 会话
tmux new -s rnaseq_pipeline
# 2. 在 tmux 里,以低优先级启动主流程
nice -n 10 bash run_pipeline.sh &
# 3. 开另一个 tmux 窗格(Ctrl+B 然后 %)监控
htop
# 或持续监控特定进程
watch -n 2 'ps aux | grep bwa'
# 4. 分离 tmux,放心离开
# Ctrl+B 然后 D
# 几小时后回来重连
tmux attach -t rnaseq_pipeline
# 5. 如果某个样本卡住了
htop F9 选进程 选信号 SIGTERM 回车

6. 踩坑记录#

坑1:kill -9 之后文件损坏#

症状:kill -9 了 BWA 进程,后面想续跑发现中间文件(如 SAM)损坏了——文件大小正确但内容截断。

原因:SIGKILL 不会让进程 flush 缓冲区。BWA 正在写入时被杀,缓冲区里的数据没落到磁盘。

教训: 先用 kill(SIGTERM),大多数生信软件(BWA、samtools、GATK)都正确处理 SIGTERM 并优雅退出。kill -9 留到最后。

坑2:Load average 很低但系统很卡#

症状:htop 显示 CPU 和内存都不高,load average < 1,但 ssh 输入有明显延迟,文件读写很慢。

原因:磁盘 I/O 瓶颈。htop 的 CPU 条里红色部分多、或者 iostat -x 1 显示 %util 接近 100%。

Terminal window
# 安装并查看 I/O 统计
sudo apt install sysstat -y
iostat -x 1
# 查看谁在疯狂写盘
iotop
# 或
pidstat -d 1

坑3:Ctrl+Z 之后忘了 bg,直接关终端#

症状:BWA 跑了一半,Ctrl+Z 暂停了,然后忘了 bg,直接关了终端。进程变成 stopped 状态,再也不会继续跑了。

解决:

Terminal window
# 下次登录后,找到被暂停的进程
ps aux | grep bwa
# STAT 列显示 T(stopped)
# 恢复它
kill -CONT 12345
# 或者
bg # 如果你在同一 shell

坑4:nohup 输出把磁盘写满了#

症状:把 nohup 的默认输出(nohup.out)忘在了主目录,一个月后发现 nohup.out 有 50GB。

Terminal window
# 好习惯:重定向 nohup 输出
nohup bash pipeline.sh > pipeline.log 2>&1 &
# 或者直接丢弃输出
nohup bash pipeline.sh > /dev/null 2>&1 &
# 定期检查大文件
find ~ -name "nohup.out" -size +1G

坑5:renice 报错 “Permission denied”#

Terminal window
renice -n -5 -p 12345
# renice: failed to set priority for 12345: Permission denied

只能降低自己进程的优先级(正 nice 值),提高优先级(负值)需要 root 权限。降优先级不需要 sudo:

Terminal window
renice -n 10 -p 12345 # OK——降低自己进程的优先级
sudo renice -n -5 -p 12345 # 需要 sudo

坑6:pkill 误杀#

Terminal window
# 危险:pkill bwa 会杀所有含 bwa 的进程
pkill bwa
# 更安全:pkill -f 精确匹配
pkill -f "^bwa mem"
# 最安全:先确认再杀
pgrep -a bwa # 先看看会杀哪些
# 确认无误后
pkill bwa

坑7:僵尸进程堆积#

症状:htop 里出现 Z(zombie)状态进程,数量越来越多但不消耗 CPU 和内存。

Terminal window
ps aux | grep 'Z'

僵尸进程是已结束但父进程还没回收的子进程。通常无害但数量多了说明父进程有问题。

Terminal window
# 找到僵尸进程的父进程
ps -eo ppid,pid,stat,comm | grep 'Z'
# 杀掉父进程让 init 接管回收
# 或用以下命令清理(慎用)
kill -CHLD <parent_pid>

7. 小结#

操作命令记忆要点
查看进程htop / ps auxhtop更直观
优雅终止kill PID默认SIGTERM,等5秒
强制终止kill -9 PID最后手段
降低优先级nice -n 10 cmd数字越大越谦让
调整优先级renice -n 10 -p PID降优先无需sudo
后台运行nohup cmd &用tmux更好
断线保护tmux new -s name长任务常用
批量杀pkill -f pattern先pgrep确认

服务器不是个人电脑——它是全组共享的计算资源。把进程管理用好了,既保护自己的数据,也对得起同组同学的信任。


本文于 2025-04-05 在 Debian 12 上实测完成。htop 3.3.0,tmux 3.4,所有命令可直接复制使用。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Linux进程管理:htop/ps/kill/nice
https://fg.ink/posts/linux-process-management/
作者
风观
发布于
2024-03-01
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
50
分类
1
标签
29
总字数
61,837
运行时长
0
最后活动
0 天前

文章目录