Linux常用命令与服务器排查笔记

O泡李华 4

Linux 常用命令笔记:文件操作、日志查找与服务器排查

一、先理解命令、路径与终端

1. 命令的基本结构

命令 [选项] [参数]

例如:

ls -lah /var/log

其中 ls 是命令,-lah 是多个短选项的组合,/var/log 是参数。

命令和文件名通常区分大小写。包含空格的路径应加引号:

cd "my project"

2. 常见路径符号

符号 含义
/ 文件系统根目录
~ 当前用户的主目录
. 当前目录
.. 上级目录
/var/log/app.log 绝对路径,从根目录开始
logs/app.log 相对路径,从当前目录开始

root 是管理员用户名称,/ 是根目录,/root 通常是 root 用户的主目录,三者不要混淆。

3. 常见目录

目录 常见用途
/home 普通用户主目录
/etc 系统与服务配置
/var/log 系统及部分服务日志
/tmp 临时文件,可能被系统清理
/opt 附加软件及应用安装目录
/usr 大量系统程序和共享资源
/proc 内核提供的进程与系统信息接口

4. 常用快捷键

快捷键 作用
Tab 补全命令或路径
Ctrl+C 向前台任务发送中断信号,通常用于结束任务
Ctrl+D 发送输入结束;在空提示符处通常退出 Shell
Ctrl+L 清屏,历史输出通常仍可滚动查看
Ctrl+R 反向搜索命令历史
Ctrl+Z 挂起前台任务,不等于结束进程
上、下方向键 浏览命令历史

二、获取帮助

# 查看命令手册,按 q 退出
man ls

# 查看命令支持的选项
ls --help

# 查看 Shell 内置命令帮助
help cd

# 查看某个命令如何被解析,例如别名、函数或程序
type ls

# 判断程序是否可用及其位置
command -v java

遇到 command not found,先检查命令名称、是否安装对应软件,以及 PATH 是否包含其目录。

三、目录浏览与创建

# 显示当前目录
pwd

# 查看当前目录内容
ls

# 查看详细信息、隐藏文件和易读的文件大小
ls -lah

# 进入目录
cd /var/log

# 回到主目录
cd ~

# 回到上级目录
cd ..

# 回到上一次所在目录
cd -

# 创建目录,必要时创建父目录
mkdir -p ~/linux-notes/logs

ls -l 开头的类型字符中,d 表示目录,- 表示普通文件,l 表示符号链接。以点开头的文件通常是隐藏文件。

四、文件创建、复制、移动与删除

1. 创建文件

# 文件不存在时创建空文件;存在时更新时间戳
touch notes.txt

# 写入一行内容,覆盖原内容
printf '%s\n' 'Hello Linux' > notes.txt

touch 不会清空已有文件。

2. 复制与移动

# 复制文件
cp app.yml app.yml.bak

# 覆盖目标前询问
cp -i app.yml backup.yml

# 递归复制目录
cp -r config config-backup

# 保留常见属性并递归复制
cp -a config config-backup

# 重命名文件
mv -i old.txt new.txt

# 移动到目录
mv -i notes.txt ~/linux-notes/

目标目录是否已经存在,会影响复制后目录的层次。操作前先确认目标结构。GNU cp 手册

3. 删除文件或目录

# 删除文件前询问
rm -i old.log

# 删除空目录
rmdir empty-dir

# 递归删除目录,并对各项询问
rm -ri test-dir

rm 通常不会将文件送入桌面回收站。常见参数中的 -r 表示递归处理,-f 表示不询问,并忽略不存在的目标等情况。

执行递归删除前先用 pwd、ls 确认目标,尤其不要直接拼接未检查的变量或通配符。删除以短横线开头的文件,可以用 -- 结束选项解析:

rm -i -- -old.log

GNU rm 手册

五、查看文件与日志

# 查看较小文件
cat app.yml

# 分页查看大文件,按 q 退出
less app.log

# 查看前 20 行
head -n 20 app.log

# 查看最后 100 行
tail -n 100 app.log

# 持续查看文件追加内容
tail -f app.log

# 按文件名跟随,适合日志轮转后重新创建同名文件的情况
tail -F app.log

# 查看文件类型
file app.log

less 中输入 /ERROR 向后搜索,按 n 查找下一个匹配项。tail -f 或 tail -F 可用 Ctrl+C 退出查看,不会因此停止产生日志的服务。

六、查找文件与搜索内容

1. find:按文件属性查找

# 在指定目录中查找日志文件
find ./logs -type f -name '*.log'

# 不区分大小写匹配文件名
find . -type f -iname '*.yaml'

# 查找大于 100 MiB 的普通文件
find ./logs -type f -size +100M

# 查找修改时间超过 7 个完整 24 小时区间的文件
find ./logs -type f -mtime +7

-name 的模式加引号,是为了让 find 自己处理 *,避免 Shell 提前展开。

GNU find 的 -mtime 按 24 小时区间向下取整,+7 表示取整后的值大于 7,不是简单地按日历日期判断。清理日志前先仅列出目标,确认后再执行删除。GNU Findutils 手册

2. grep:按内容搜索

# 查找包含 ERROR 的行,并显示行号
grep -n 'ERROR' app.log

# 忽略大小写
grep -ni 'error' app.log

# 搜索目录内的普通内容文件,默认不递归跟随发现的符号链接
grep -rn 'timeout' ./logs

# 输出匹配行前后各 3 行
grep -n -C 3 'Exception' app.log

# 固定字符串匹配,不将点号等字符解释成正则表达式
grep -nF '192.168.1.10' app.log

# 使用扩展正则匹配两个关键字之一
grep -nE 'ERROR|WARN' app.log

# 排除包含 DEBUG 的行
grep -v 'DEBUG' app.log

grep 默认使用正则表达式;要搜索字面字符串时可以优先使用 -F。GNU grep 手册

3. 文本处理补充

# 统计行数
wc -l app.log

# 显示第 10 到 20 行
sed -n '10,20p' app.log

# 按空白分隔字段,输出第一列
awk '{print $1}' access.log

# 对内容排序
sort names.txt

# 去重并统计各行出现次数
sort names.txt | uniq -c

uniq 只合并相邻的重复行,因此全文件去重通常先排序。wc -l 统计换行符数量,最后一行没有换行符时会影响结果。

七、管道与重定向

1. 管道:连接两个命令

# 查看最后 100 行中的 ERROR
tail -n 100 app.log | grep -n 'ERROR'

# 统计包含 ERROR 的行数
grep -c 'ERROR' app.log

| 默认把左边命令的标准输出作为右边的标准输入,不包含标准错误。

2. 输出到文件

# 覆盖写入
printf '%s\n' 'first line' > notes.txt

# 追加写入
printf '%s\n' 'next line' >> notes.txt

# 将输入从文件读取
sort < names.txt

# 同时显示和写入文件;默认覆盖文件
printf '%s\n' 'Hello' | tee output.txt

# 同时显示和追加
printf '%s\n' 'Hello' | tee -a output.txt

**> 通常会先创建或清空目标文件,再执行命令;>> 用于追加。**不要用 cat file > file 等方式处理同一个输入输出文件,它会提前清空输入。

3. 标准输出与标准错误

# 标准输出和标准错误都追加到日志
java -jar app.jar >> app.log 2>&1

# 丢弃标准输出
command > /dev/null

1 表示标准输出,2 表示标准错误。2>&1 表示将标准错误指向此时标准输出的目标,重定向顺序会影响结果。Bash 重定向说明

八、文件权限与所有者

1. 理解 rwx

典型权限字符串:

-rwxr-xr--
 │  │  │
 │  │  └──其他用户:读
 │  └─────所属组:读、执行
 └────────所有者:读、写、执行
权限 数值 普通文件 目录
r 4 读取内容 列出目录项名称
w 2 修改内容 创建、删除或重命名目录项,通常还需要 x
x 1 执行文件 进入目录并访问目录中的路径

删除文件主要受父目录权限影响,还可能受 sticky bit 等限制,并不单纯取决于文件是否可写。

2. chmod:修改权限

# 给所有者添加执行权限
chmod u+x start.sh

# 所有者读写,组和其他用户只读
chmod 644 app.yml

# 所有者全部权限,组和其他用户读、执行
chmod 755 start.sh

# 只有所有者可读写
chmod 600 private.conf

例如 755 中,7=4+2+1,5=4+1。不要遇到权限问题就直接设置 777;先检查运行用户、文件用途和父目录权限。GNU chmod 手册

3. 身份与所有者

# 查看当前用户名
whoami

# 查看用户 ID 和组信息
id

# 修改文件所有者和组,用户与组须存在
sudo chown appuser:appgroup app.log

sudo 根据授权策略以其他身份执行命令,默认通常是 root,并不是所有命令都需要它。遇到 sudo command > file 权限问题时,要注意重定向通常由当前 Shell 执行,不会因为命令前加了 sudo 就自动提权。

九、进程查看与结束

# 查看系统进程
ps aux

# 查看一个 PID 的详细信息
ps -p 12345 -o pid,ppid,user,etime,args

# 按进程名查找并显示命令行
pgrep -a java

# 实时查看 CPU、内存等,按 q 退出
top

PID 是进程编号,必须使用当前实际查询到的值。进程可能已经退出,原 PID 也可能被重新分配。

发送结束信号

# 默认发送 SIGTERM,请求进程正常退出
kill 12345

# 显式发送 SIGTERM
kill -TERM 12345

# 仅在必要时发送 SIGKILL,强制结束
kill -KILL 12345

kill -9 与 kill -KILL 都发送 SIGKILL。进程无法捕获它来清理资源,因此优先使用正常停止方式。systemd 管理的服务应优先使用 systemctl stop。kill 手册

临时后台运行

# 演示临时运行 Java 应用
nohup java -jar app.jar >> app.log 2>&1 &

# 查看当前 Shell 管理的任务
jobs

# 将当前挂起任务恢复到前台
fg

& 将任务放到后台,nohup 让程序忽略挂断信号。它们不提供服务自动重启、开机启动等完整管理能力,长期服务通常交给 systemd 或容器平台管理。

十、磁盘、内存与系统信息

# 文件系统容量与使用情况
df -h

# inode 使用情况,大量小文件也可能耗尽 inode
df -i

# 统计当前目录占用空间
du -sh .

# GNU du:统计当前目录下一层子目录
du -h --max-depth=1 .

# 内存和交换空间
free -h

# 内核及系统信息
uname -a

# 发行版信息
cat /etc/os-release

# 运行时间和负载
uptime

df 查看文件系统使用情况,du 统计路径下文件占用,两者结果可能不同。被删除但仍由进程打开的文件可能继续占用磁盘;有权限时可用 sudo lsof +L1 辅助检查,系统需安装 lsof。

查看内存时,关注 available,不要把缓存占用简单视为内存不足。负载也不等于 CPU 使用率。

十一、网络与端口检查

# 查看网卡地址
ip addr

# 查看路由
ip route

# 测试 ICMP 连通性,发送 4 次
ping -c 4 example.com

# 查看监听的 TCP 端口,尽可能显示进程
sudo ss -lntp

# 查看 8080 TCP 监听端口
sudo ss -lntp 'sport = :8080'

# 查看监听的 UDP 端口
sudo ss -lnup

ss 中的 -l 表示监听、-n 表示数字形式、-t 表示 TCP、-u 表示 UDP、-p 表示进程。进程信息可能需要足够权限。

ping 成功不代表应用接口正常,失败也可能只是对方禁用 ICMP。ip 手册

HTTP 请求检查

# 请求本地接口,限制总时长
curl --max-time 10 http://127.0.0.1:8080/hello

# 连响应头一起显示
curl -i --max-time 10 http://127.0.0.1:8080/hello

# 查看通信细节
curl -v --max-time 10 http://127.0.0.1:8080/hello

# 下载文件,并让 HTTP 错误状态表现为命令失败
curl -fL --max-time 60 -o package.zip https://example.com/package.zip

最后一个 URL 是占位示例,需换成实际下载地址。-I 发送 HEAD 请求,并非所有接口都支持。-v 可能显示请求头等信息,分享输出前注意其中是否包含凭据。

服务只监听 127.0.0.1 时,通常只能从本机访问。外部访问还需要检查防火墙、云安全组、代理和路由。容器内的 127.0.0.1 指向容器自己。

十二、SSH 远程连接与文件传输

# 连接远程服务器
ssh user@server.example.com

# 指定 SSH 端口,小写 p
ssh -p 2222 user@server.example.com

# 上传文件
scp app.jar user@server.example.com:/home/user/apps/

# 下载日志
scp user@server.example.com:/home/user/apps/app.log ./

# scp 指定端口,注意是大写 P
scp -P 2222 app.jar user@server.example.com:/home/user/apps/

目标目录需存在且有权限。第一次连接会提示确认主机密钥,应核对服务器指纹;后续出现主机密钥变化时,需要查明服务器是否重装或地址是否变化。

十三、压缩与解压

# 将 logs 目录打包并使用 gzip 压缩
tar -czf logs.tar.gz logs/

# 查看归档内文件列表
tar -tzf logs.tar.gz

# 解压到指定目录,目录需提前存在
mkdir -p extracted
tar -xzf logs.tar.gz -C extracted/

# ZIP 文件,需要安装 unzip
unzip -l package.zip
unzip package.zip -d extracted/

tar 参数中,c 是创建、x 是解包、t 是列出、z 是 gzip、f 是指定归档文件。处理不熟悉的归档时,可以先列出内容,再解压到独立目录,避免覆盖现有文件。

十四、软件安装:按发行版选择命令

Ubuntu / Debian:apt

# 更新软件包索引,不是升级所有已安装软件
sudo apt update

# 安装软件
sudo apt install curl

# 搜索软件包
apt search nginx

# 查看软件包信息
apt show nginx

# 卸载软件包
sudo apt remove nginx

apt upgrade 用于升级已安装软件,可能影响正在运行的服务,应与 apt update 区分。Ubuntu 软件包管理文档

RHEL 系等发行版:dnf

# 安装软件
sudo dnf install curl

# 搜索软件包
dnf search nginx

# 查看软件包信息
dnf info nginx

# 检查可用更新
dnf check-update

# 卸载软件包
sudo dnf remove nginx

dnf check-update 有更新时可能返回状态码 100,不应直接理解为命令故障。旧环境可能使用 yum,包名与仓库内容也可能不同。Red Hat DNF 文档

十五、systemd 服务与日志

以下以已安装并提供 nginx.service 的环境为例:

# 查看服务状态
systemctl status nginx

# 启动服务
sudo systemctl start nginx

# 停止服务
sudo systemctl stop nginx

# 重启服务
sudo systemctl restart nginx

# 请求重新加载配置,服务须支持 reload
sudo systemctl reload nginx

# 设置开机启动,并立即启动
sudo systemctl enable --now nginx

# 查看是否设置开机启动
systemctl is-enabled nginx

start 管当前运行,enable 管启动关联;仅执行 enable 不代表现在已经启动。修改 unit 文件后通常需要 sudo systemctl daemon-reload,它也不等于重新加载应用自己的配置。

服务单元名称由实际安装方式决定。普通容器通常不运行 systemd,不能照搬这些命令。

查看服务日志

# 查看服务最近 100 条日志
sudo journalctl -u nginx -n 100 --no-pager

# 持续查看服务日志
sudo journalctl -u nginx -f

# 查看本次开机以来的服务日志
sudo journalctl -u nginx -b

# 查看最近 30 分钟的服务日志
sudo journalctl -u nginx --since '30 minutes ago'

应用自行写入文件的日志不一定全部出现在 journal 中,还需要检查应用日志配置。systemd 日志手册

十六、简单编辑文件与环境变量

文件编辑

# 使用 nano 编辑,需已安装
nano app.yml

# 使用 vi 编辑
vi app.yml

nano 中通常用 Ctrl+O 保存、回车确认文件名,再用 Ctrl+X 退出。

vi 的基本操作:按 i 进入插入模式,按 Esc 返回普通模式,再输入 :wq 保存退出,或输入 :q! 放弃修改退出。修改已有配置前,可以先复制一份备份。

环境变量

# 查看 PATH
printf '%s\n' "$PATH"

# 为当前 Shell 及之后启动的子进程设置变量
export APP_ENV=dev

# 仅为一次命令设置环境变量
APP_ENV=dev java -jar app.jar

# 取消变量
unset APP_ENV

export 不会自动修改已经运行的服务,也不会永久保存设置。Shell 配置、systemd 服务配置和容器环境变量是不同的配置入口。

十七、一个常见服务器排查流程

假设 Java 应用的 8080 端口无法访问,可以按顺序检查:

# 1. 确认当前机器和用户
hostname
whoami

# 2. 查看 Java 进程
pgrep -a java

# 3. 查看端口是否监听及监听地址
sudo ss -lntp 'sport = :8080'

# 4. 本机请求实际接口
curl -i --max-time 10 http://127.0.0.1:8080/hello

# 5. 检查应用日志,替换成实际路径
tail -n 100 /path/to/app.log

# 6. 查看磁盘与内存
df -h
df -i
free -h

如果应用由 systemd 管理,再检查实际服务的 systemctl status 和 journalctl。

  • 没有进程:检查启动失败或退出原因。
  • 有进程但没有端口:检查应用是否仍在启动、端口配置是否正确。
  • 本机接口正常但外部失败:检查监听地址、防火墙、安全组和代理。
  • 返回 404:检查请求路径、方法和应用前缀。
  • 返回 401 / 403:检查认证与授权。
  • 响应慢:结合日志、CPU、内存、数据库与下游调用继续定位。

十八、常用命令速查

场景 命令
查看当前位置 pwd
列出文件 ls -lah
切换目录 cd 路径
创建目录 mkdir -p 路径
创建空文件或更新时间 touch 文件名
复制文件 cp -i 源文件 目标文件
移动或重命名 mv -i 源路径 目标路径
删除前询问 rm -i 文件名
分页查看文件 less 文件名
跟随日志轮转 tail -F 日志文件
搜索文件 find 路径 -type f -name '*.log'
搜索固定字符串 grep -nF '关键字' 文件名
查看进程 ps aux
查找 Java 进程 pgrep -a java
查看 TCP 监听端口 sudo ss -lntp
查看磁盘 df -h
查看目录占用 du -sh 目录
查看内存 free -h
请求 HTTP 接口 curl -i --max-time 10 URL
远程连接 ssh 用户@主机
查看服务状态 systemctl status 服务名
查看服务日志 journalctl -u 服务名 -f
获取帮助 man 命令名