netstat -lntp

含义:查看当前系统正在监听(Listening)的 TCP 网络端口及其对应的进程。
netstat 是 “Network Statistics” 的缩写。这是一个经典的老牌工具。
参数详解:

  • -l (listening):只显示正在监听的套接字(即正在等待连接的服务,如 Web 服务器等待 HTTP 请求)。如果不加此项,还会显示已经建立连接(ESTABLISHED)的会话。
  • -n (numeric):直接显示数字形式的 IP 地址和端口号,不去尝试解析域名或服务名(例如显示 80 而不是 http,显示 127.0.0.1 而不是 localhost)。这能显著提高命令执行速度。
  • -t (tcp):只显示 TCP 协议的连接。如果不加,可能还会显示 UDP 或 Unix Socket。
  • -p (program):显示占用该端口的进程 ID (PID) 和 程序名称。

ss -lntp

含义:与 netstat -lntp 含义完全相同,是其现代化的替代品。
ss 是 “Socket Statistics” 的缩写。
参数详解:

  • -l:显示监听状态的 socket。
  • -n:不解析服务名称(显示数字)。
  • -t:只显示 TCP socket。
  • -p:显示对应的进程信息(同样需要 root 权限才能看全)。
    为什么用 ss 而不是 netstat?
  • 速度更快:netstat 是通过读取 /proc 文件系统来获取信息的,当连接数成千上万时,速度会很慢。
  • ss 直接从内核空间获取信息(利用 Netlink 机制),在高并发场景下效率极高。
    现状:在许多极简版的 Linux 发行版(如某些 Docker 镜像或 CentOS 7/8 最小化安装)中,默认可能没有 netstat,但通常会有 ss

ps aux

含义:查看系统中当前运行的所有进程的详细信息。
ps 是 “Process Status”(进程状态)的缩写。aux 是 BSD 风格的参数组合(注意这里通常不加短横线 -,虽然加了也能用)。
参数详解:

  • a (All):显示所有用户的进程(不仅仅是当前用户的),通常指包含终端(tty)的进程。
  • u (User):以用户为主的格式进行显示(显示启动进程的用户、CPU、内存占用等详细信息)。
  • x:显示没有控制终端的进程(通常是后台服务、守护进程,如 nginx、mysql 等)。

常用场景:

  • CPU 或内存飙高时,查找是哪个进程在占用资源。
  • 查看某个服务(如 python 脚本)是否正在运行。
  • 获取进程的 PID(进程 ID),以便将其杀掉(kill)。

输出关键列解释:

  • USER: 运行该进程的用户。
  • PID: 进程 ID。
  • %CPU: CPU 占用率。
  • %MEM: 内存占用率。
  • VSZ / RSS: 虚拟内存和物理内存占用量。
  • STAT: 进程状态(R=运行, S=睡眠, Z=僵尸进程等)。
  • COMMAND: 启动该进程的具体命令

grep “str” .

场景命令组合解释
搜代码grep -rn "函数名" .递归当前目录-r + 显示行号-n
搜日志grep -iC 5 "error" log忽略大小写 + 上下文5行
排查配置`grep -vE "^#^$" conf`
查进程`ps auxgrep xxx`

lsof -ti:5001 | xargs kill -9 2>/dev/null; sleep 1; cd

强制关闭占用 5001 端口的进程,稍作等待,然后回到用户的主目录。

  • lsof: List Open Files(列出当前系统打开的文件/网络连接)。

  • -i:5001: 筛选条件,只找占用 5001 端口的网络连接。

  • -t: Terse(简洁模式)。只输出 PID(进程 ID) 数字,不输出表头和其他多余信息。如果不加这个,输出的是个表格,kill 命令看不懂。

  • |: 管道符。把前面 lsof 找到的 PID 数字传递给后面的命令。

  • xargs: 把管道传过来的数据(PID)构建成参数列表,喂给后面的 kill 命令。

  • kill -9: 发送 SIGKILL 信号。强制杀死进程,不给进程任何清理或保存数据的机会(“立刻去死”)。

  • 2>: 代表标准错误输出(Standard Error)。

  • /dev/null: 这里的“空设备”相当于垃圾桶。

  • 含义:把所有报错信息丢进垃圾桶,保持终端清爽。如果当前没有进程占用 5001 端口,lsof 没有任何输出,kill 命令可能会报错说“我没收到参数”或者“找不到进程”。

输入输出重定向(Redirection)

核心概念:文件描述符

在 Linux 系统中,一切皆文件,标准输入输出也是文件:

  • 0:标准输入(stdin
  • 1:标准输出(stdout),用于正常打印信息
  • 2:标准错误(stderr),用于错误信息
2>/dev/null(静默模式)
  • 含义:将报错信息(通道 2)扔进“黑洞设备”/dev/null
  • 作用:执行命令时,只显示正常结果,屏蔽所有报错
  • 场景:command -v node 2>/dev/null
  • 适合:只想知道命令是否可用,不想看到报错输出
2>&1(错误合并)
  • 含义:将报错信息(通道 2)重定向到标准输出(通道 1
  • 注意:&1 表示“引用文件描述符 1”,不是文件名 1
  • 作用:让正常输出和错误输出走同一条通道,方便后续统一处理
  • 常见用途:配合 grepawk、管道、日志文件一起使用
  • 场景:make install > log.txt 2>&1

小结

  • >:重定向标准输出
  • 2>:重定向标准错误
  • 2>/dev/null:忽略错误输出
  • 2>&1:把错误输出并入标准输出

Makefile 基础结构

依赖目标(Prerequisites)

Make 的核心逻辑是:先满足依赖,再执行目标

# 语法
目标名称: 依赖目标1 依赖目标2
	命令1
	命令2

示例

有依赖
clean: stop
	rm -rf logs

解释:

  • 执行 clean 前,make 会先执行 stop
  • 只有依赖满足后,才会执行 rm -rf logs
无依赖
docker-init:
	./scripts/docker.sh init

解释:

  • docker-init 没有依赖
  • 运行时直接执行后面的命令

关键点

  • 目标后面跟冒号 :
  • 命令行前必须是 Tab,不能随便用空格替代
  • 依赖描述的是“执行顺序”和“前置条件”

配置文件初始化技巧

在 Makefile 或 Shell 脚本中,经常会用这种“安全初始化”写法:

test -f .env || cp .env.example .env

拆解理解

  • test -f .env:检查 .env 文件是否存在
  • ||:逻辑或,只有左边失败时才执行右边
  • cp .env.example .env:从模板复制生成配置文件

通俗解释

如果配置文件不存在,就自动复制一份模板;如果已经存在,就什么都不做,从而避免覆盖现有配置。

设计意义

  • 幂等:重复执行也安全
  • 保守:不破坏用户已有配置
  • 适合初始化脚本、make init、启动前检查

进程管理:kill vs pkill

命令识别方式适用场景形象比喻
killPID(进程 ID)精准查杀,不想误伤同名进程狙击手
pkill进程名批量清理,方便快捷清场
kill
  • 按 PID 杀进程
  • 优点:精确,不容易误伤
  • 缺点:要先查出 PID
pkill
  • 按进程名匹配并终止进程
  • 优点:方便快捷
  • 缺点:可能误杀同名进程
pkill -f
  • -f 表示匹配完整命令行,而不仅仅是进程名
  • 例如:
    • pkill node:杀掉所有叫 node 的进程
    • pkill -f "next dev":更精准地杀掉运行 next dev 的进程

经验总结

  • 想要精准:优先 kill PID
  • 想要方便:可以用 pkill
  • 想要避免误杀:优先 pkill -f "更具体的命令行"

awk

awk 用于对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能
| awk -F'/' '{print $$2}'

  • awk -F'/': -F 是指定分隔符。例如 -F'/'就是用 / 作为分隔符。
  • 假设输入是 nginx/1.27.0
  • 切开后:
    • $1 = nginx
    • $2 = 1.27.0
3. $$2
  • 因为这是写在 Makefile 里,所以不能写 $2
  • 必须写成 $$2,让 Make 转义后交给 Shell / awk

最终效果

这行命令会把 Nginx 的版本号提取出来,例如:

1.27.0

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐