一些容易被忽略的 Linux 命令
posts/a-few-easily-overlooked-linux-commands本文记录了我自己一些在日常使用和排障过程中逐渐形成依赖的 Linux 命令(其实有些是 Unix 祖传下来的, 有些是替代版本)。
这里有不少命令是我观察 AI 工具工作行为学习的,它们不算冷门,但也很少出现在新手教程中。
进程作业控制
disown、pgrep、pkill、fuser
假设我想在局域网中使用 caddy 启动一个 HTTP 文件服务器,并希望将其挂到后台运行。
不少人会第一时间使用 nohup 去挂起 caddy 运行,但在这个场景下,其实有一个更轻量的选择:disown。
示例:
caddy file-server --browse --listen :18080 & disown
这样,caddy 进程会直接从当前 shell 的作业控制中脱离,不会因为终端被关闭而被一并杀掉,同时也不会产生额外的输出文件。
当需要关闭这个服务时,常见的做法是借助 htop、ps 等工具定位进程再手动 kill。
但在这个场景下,其实有更直接的方式。
如果只是想获取该进程的 PID,可以使用:
pgrep caddy
拿到 PID 后再执行 kill 即可。
如果你确定当前只有一个 caddy 实例在运行,那么可以进一步简化为:
pkill caddy
当然,这种方式的前提是进程名足够明确。
像 java 这类前缀高度重复的进程,就很难仅凭名称精确区分。
这时可以换一个角度,从“资源”而不是“进程名”入手。
fuser 正是为此设计的工具。部分发行版默认未安装,需要额外安装 psmisc。
针对上面监听在 18080 端口的 caddy 服务,可以直接执行:
fuser -k 18080/tcp
无需关心进程名或 PID,直接终止占用该端口的进程。
除了端口,fuser 还可以用来检查哪些进程正在占用某个文件、目录或挂载点。
在定位“资源被占用”的问题时,这个视角往往比 ps 更直接。
在这个小场景中,已经涉及了 disown、pgrep、pkill、fuser 四个命令,都是实际使用频率不低,但不太容易被系统性介绍到的工具。
pstree
相比 ps,在需要理解进程之间关系的场景下,pstree 往往更合适。
它以树状结构展示进程层级,直观程度上接近 htop 的 tree 视图,但更加轻量,也更专注于进程结构本身。
通过 pstree 可以直观看到 systemd 是如何派生并托管服务进程的,也能判断某个服务在运行过程中实际 fork 了多少子进程。这在分析“进程已经被 kill,却仍然残留”的问题时尤为有用。
使用方式:
pstree -ap <pid>
在一些场景下你会发现,使用 pkill 或 kill 实际终止的只是叶子节点,而真正负责拉起子进程的父进程仍然存活。
如果不先搞清楚进程树结构,很容易陷入“杀了又起”的循环。
atop
很多人日常会使用 htop,但 atop 往往被忽略。
与 htop 偏向实时观感不同,atop 类似于一个飞行记录仪(black box)比 Prometheus 要轻一些, 前提你需要启用 atop.service:
日志存放在:
/var/log/atop/atop_YYYYMMDD
进行事后分析:
atop -r /var/log/atop/atop_20260105
这样你就可以回溯几分钟前的资源使用情况,明确看到 OOM killer 实际终止了哪个进程,并在同一视角下观察 CPU、内存、磁盘、网络和进程状态。
此外还拥有类似 htop 的实时分析功能:
atop -m #内存相关
atop -d #磁盘相关
atop -c #命令行相关
atop -y #线程相关
atop -v #查看进程启用时间
atop -au #所有用户进程数
atop -s #进程在哪个CPU核心上工作
详细使用可参考 A guide to atop command in Linux | DigtialOcean 这篇文章。
watch
watch 可以将一次性命令转变为周期性执行的“动态视图”,适合做一些临时观察。
例如查看 443 端口的建立连接状态:
watch -d 'ss -tanp | grep 443'
这种方式更适合一些临时观察场景,例如想快速确认端口连接数是否在变化,或判断某个条件在一段时间内是否持续成立。
这样遇到需要自己去重复执行命令观察的场景,watch 最快的选择。
文件 / IO 侧
lsof (但别只会 lsof -i)
生产环境 lsof 最常见的用法是查看端口占用,但在文件系统问题中,它的价值往往更大。
一个非常实用的地方是排查文件是否已经被删除,但磁盘空间仍然没有释放的场景。
可以使用:
lsof +L1
它会列出所有链接数为 0、但仍被进程持有的文件。
在日志轮转、程序异常退出等场景下,这往往是定位磁盘异常的关键一步。
fallocate
相比 dd,fallocate 更符合现代文件系统的使用方式。
它并不是通过写入数据来“填满文件”,而是直接向文件系统申请并保留一段连续的空间,因此不会经过用户态 IO,也不会污染 page cache。
在磁盘空间预分配或文件系统行为测试中,这一点非常重要。你可以在不真正写入数据、不对磁盘造成额外压力的情况下,构造一个真实占用空间的非稀疏文件,用来观察磁盘接近满载时系统的反应。
相比之下,dd if=/dev/zero 的方式虽然直观,但本质上仍然是一次完整的写入过程,既慢,也更容易干扰其他 IO 行为。
例如,创建一个 10G 的文件用于空间预分配:
fallocate -l 10G testfile
这个文件在文件系统层面已经占据了完整空间,但几乎没有实际写入成本,非常适合用来测试磁盘空间耗尽、配额限制或异常处理逻辑。
stat
stat 提供的信息比 ls -l 更接近内核视角。
它直接展示文件在文件系统中的元数据状态,而不是经过简化和格式化后的结果。
在实际使用中,stat 常被用来判断一个文件是否真的发生了变化:例如 inode 是否被替换,时间戳究竟是内容修改、权限变更,还是仅仅被重新触碰过。
这在分析部署行为时尤其有用,可以帮助区分“原地更新文件”和“删除后重新创建文件”这两种看起来相似、但系统语义完全不同的操作。
stat file
另外,在权限相关的问题上,stat 给出的权限数字往往比 ls 展示的 rwx 字符串更直观。
比如在排查 SSH 密钥文件时,ls 看起来权限似乎没问题,但 stat 中的数值权限和所属关系往往能更快暴露真实原因。
网络相关
ss
ss 是 netstat 的现代版本,速度更快,也更贴近内核实现
常用示例:
ss -lunp # 显示所有 UDP 监听端口及对应进程
ss -ltnp # 显示所有 TCP 监听端口及对应进程
ss -tn # 查看所有 TCP 连接,包括客户端连接
ss -s # 显示所有连接(TCP+UDP)及端口和状态
在排查端口占用、连接状态时,ss 通常是更直接的选择。
ip
同样的 ip 是也现代 Linux 网络管理的核心命令,比老式的 ifconfig、route 更强大,也更贴近内核实现。 它不仅可以查看接口状态和 IP 地址,还能管理路由、邻居表和链路配置。
常用示例:
ip a # 显示所有网络接口及 IP 地址
ip l # 显示接口链路状态(up/down、MAC 等)
ip r # 显示路由表
ip -s l # 显示接口流量统计(收发包、错误、丢包)
ip addr add 192.168.1.10/24 dev eth0 # 给接口添加 IP
ip addr del 192.168.1.10/24 dev eth0 # 删除接口 IP
ip r add default via 192.168.1.1 # 添加默认路由
ip r del default # 删除默认路由
ip n # 查看邻居表 / ARP
ip monitor all # 实时监控 IP / 链路 / 路由变化
如果需要彩色输出的话可以试试alias ip 'ip -color=auto'
nmap –packet-trace
nmap --packet-trace 可以在扫描过程中显示每条发送和接收的网络数据包,可以直观展示网络交互。在排查网络异常时,它可以快速判断问题出在客户端、服务端,还是中间网络设备。
nmap --packet-trace 192.168.1.1 # 显示扫描时的每条包
相比普通扫描,添加 --packet-trace 参数后可以确认端口响应、过滤规则和防火墙行为是否如预期。
Shell 交互
fc
fc (bash提供) 可以直接编辑并重新执行历史命令,非常适合处理复杂或容易出错的命令行。
一个典型场景是手撕 Docker 容器启动命令:你敲了一个很长的 docker run,发现参数写错了,直接用上下键改会很麻烦,用 fc 一下就能拉到编辑器里修改完再执行,而不需要重打整条命令。
fc # 打开最近的命令进行编辑
在调试、临时部署或者连续执行复杂命令时,这个方法能节省大量输入和出错成本。
exec
exec 用于用新程序直接替换当前 shell 进程,而不是启动子进程。
在容器环境里尤其有用,比如在 Docker 容器入口脚本里,你希望 PID 1 直接运行应用,让信号转发和退出行为更自然:
exec my_app
同样也适用于脚本中临时切换上下文,避免额外进程占用和复杂管理。
杂项
strace
当程序异常、阻塞或卡死,而且你无法直接访问源码时,strace 有时候还挺管用的,他不仅限于启动程序时排查,在检测程序运行时也管用(需要 root 权限)。
比如一个服务挂住了,你想知道它到底在等待哪个文件、哪个网络请求或者被哪个系统调用卡住,strace -p <pid> 直接把系统调用过程暴露出来。
在排查文件描述符泄漏、阻塞的网络连接或者卡在权限问题的服务时,可以尝试:
strace -p <pid>
timeout
timeout 可以为任何可能挂起或不可靠的命令设置时间上限,让脚本和自动化操作更可控。
例如,你在 CI/CD 脚本里执行一个外部命令或网络请求,怕它卡住整个流程,用 timeout 可以自动终止,保证流水线不会被挂死:
timeout 5s some_command
这条命令会在 5 秒后自动终止 some_command,把不受信任或可能阻塞的操作变成可控对象。
结语
本文只是简单的介绍这些命令的基本使用,当然他们在更多的场景下有更多的用法,这里就交给读者自行探索。