linux 常用命令学习
文章目录
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 aux | grep 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 - 作用:让正常输出和错误输出走同一条通道,方便后续统一处理
- 常见用途:配合
grep、awk、管道、日志文件一起使用 - 场景:
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
| 命令 | 识别方式 | 适用场景 | 形象比喻 |
|---|---|---|---|
kill | PID(进程 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
更多推荐



所有评论(0)