Linux常用命令与服务器排查笔记
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
五、查看文件与日志
# 查看较小文件
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 命令名 |