Linux 常用命令
文件、日志、进程、服务和网络的常用命令。
进入项目并定位文件
先确认项目目录,再查找文件。
确认主机、身份与工作目录
hostname
id
pwd
cat /etc/os-release
cd /srv/app
# 仅在 cd 成功后继续
pwd
ls -lahls -a 显示隐藏文件,-l 显示权限、属主、大小和修改时间,-h 使用易读的容量单位。
按名称和类型寻找文件
find . -maxdepth 3 -type f -name "*.conf" -print
find . -type d -name "logs" -print
find . -type f -mmin -30 -print-type f 匹配文件,-type d 匹配目录,-mmin -30 匹配最近 30 分钟修改过的文件。通配模式加引号,避免被 Bash 展开。
核对文件属性与实际指向
ls -ld -- ./config ./config/app.conf
stat -- ./config/app.conf
readlink -f -- ./currentls -ld 查看目录自身,stat 查看文件属性,readlink -f 解析符号链接的实际路径。
从日志定位一次请求异常
用错误关键词或请求 ID 搜索日志,再查看前后文。
搜索关键词并保留行号
rg -n -F -- "request-123" ./logs
rg -n -C 3 -F -- "timeout" ./logs/app.log-F 按字面量匹配,-n 显示行号,-C 3 保留前后各 3 行。rg 默认跳过隐藏文件、被忽略文件和二进制文件。
也可以用 grep:
grep -nF -C 3 -- "timeout" ./logs/app.log
# 明确需要包含隐藏和被忽略的文本日志时
rg --hidden --no-ignore -n -F -- "request-123" ./logs阅读上下文与持续跟踪
sed -n '120,180p' ./logs/app.log
less ./logs/app.logless 中输入 /timeout 搜索,按 n 查找下一处,按 q 退出。
tail -n 100 -F ./logs/app.log-F 按文件名跟踪并重试,适合日志轮转后文件被重新创建的情况;Ctrl+C 停止跟踪。压缩归档可用 zgrep -nF -- "timeout" ./logs/app.log.1.gz 单独查询。
统计已确认格式中的字段
访问日志的第一列为 IP、各列以空白分隔时,可以这样统计:
head -n 5 ./logs/access.log
awk '{print $1}' ./logs/access.log | sort | uniq -c | sort -nr | head -n 10uniq -c 只合并相邻重复行,所以先排序。JSON 日志应使用 JSON 解析器提取字段。
修改文件前备份与核对
修改配置前先备份,改完后查看差异。
建立独立备份并比较差异
cd /srv/app
# 确认目录正确后继续
backup_dir=$(mktemp -d "$HOME/app-backup.XXXXXX")
cp -a -- ./config "$backup_dir/"
printf '备份目录:%s\n' "$backup_dir"
# 完成配置编辑后比较
diff -ru -- "$backup_dir/config" ./configcp -a 递归复制并保留文件属性。diff 返回 0 表示相同,1 表示有差异,大于 1 表示出错。
复制、移动与删除指定文件
以下分别是复制、移动和删除命令。路径带空格时加引号,-- 表示选项结束。
mkdir -p -- ./work
cp -i -- ./config/app.conf ./work/app.conf
# 需要改名时
mv -i -- ./work/app.conf ./work/app.conf.saved
# 确认临时副本不再需要时,逐项确认删除
rm -i -- ./work/app.conf.savedcp -i 和 mv -i 覆盖前会询问,rm -i 删除前会询问。删除后没有通用撤销命令。
检查归档并解包到新目录
tar -tzf app.tar.gz
# 确认包来源和目录结构后继续
unpack_dir=$(mktemp -d ./app-unpack.XXXXXX)
tar -xzf app.tar.gz -C "$unpack_dir" --no-same-owner --no-same-permissions
find "$unpack_dir" -maxdepth 2 -type f -print-t 列出归档内容,-x 解包,-z 处理 gzip,-f 指定文件。先查看内容,再解包到空目录。
处理文件权限不足
Permission denied 通常需要检查执行身份、文件属主和目录权限。
检查身份、属主与路径权限
id
ls -ld -- /srv /srv/app /srv/app/config
ls -l -- /srv/app/config/app.conf
stat -c '%A %a %U:%G %n' -- /srv/app/config/app.conf访问文件需要路径上各级目录的 x 权限。目录的 r 用于列出名称,w 与 x 用于创建、删除条目。
按文件用途调整最小权限
第一条给私有脚本增加执行权限,第二条将配置设为属主可读写、同组可读。
chmod u+x -- ./scripts/check.sh
# 配置文件采用 640 的前提是服务身份能通过属主或属组读取它
chmod 640 -- ./config/app.conf
stat -c '%A %a %U:%G %n' -- ./scripts/check.sh ./config/app.conf属主或属组有误时,按服务运行身份修正:
# appuser 与 appgroup 替换为已确认的账户和组
sudo chown appuser:appgroup -- /srv/app/config/app.conf使用实际运行身份验证
# 需要具备相应 sudo 授权;成功输出 readable
sudo -u appuser test -r /srv/app/config/app.conf && printf 'readable\n'权限位正确却仍失败时,继续检查 ACL、SELinux/AppArmor、只读或 noexec 挂载,以及 systemd 服务隔离设置。
排查磁盘空间不足
出现 No space left on device 时,先检查容量和 inode。
区分容量耗尽与 inode 耗尽
df -hT /srv/app
df -i /srv/appdf -h 查看容量,df -i 查看 inode。大量小文件可能先耗尽 inode。
逐级定位占用目录和大文件
# /srv 替换为上一步确认的排查范围
du -xhd1 /srv | sort -h
du -xhd1 /srv/app | sort -h
find /srv/app -xdev -type f -size +100M -exec ls -lh -- {} +du -x 和 find -xdev 将查找限制在当前文件系统。du -d1 按一级子目录汇总,-size +100M 查找超过 100 MiB 的文件。
检查已删除但仍占用空间的文件
sudo lsof +L1+L1 查找已经删除、但仍被进程打开的文件。让程序重新打开日志或关闭相应进程,才能释放这部分空间。
按保留策略清理并复核
journalctl --disk-usage清理 7 天前的 systemd 归档日志,删除后无法恢复:
sudo journalctl --vacuum-time=7d
journalctl --disk-usage
df -hT /srv/app
df -i /srv/app应用日志通过日志轮转清理。正在使用的数据库文件和日志应由对应程序管理。
排查进程 CPU 与内存异常
先看系统负载,再定位 CPU 或内存占用较高的进程。
观察系统总体资源
uptime
nproc
free -h
vmstat 1 5uptime 显示平均负载,free 的 available 表示可用内存。vmstat 第一行的 CPU 和速率项是开机以来的平均值,后续每秒采样。
si/so 表示换入、换出活动,wa 表示 I/O 等待。
定位进程并连续观察
ps -eo pid,ppid,user,%cpu,%mem,rss,etime,args --sort=-%cpu | head -n 15
ps -eo pid,ppid,user,%cpu,%mem,rss,etime,args --sort=-rss | head -n 15
# 1234 替换为上一步确认的 PID;按 q 退出
top -p 1234ps 的 %CPU 按进程生命周期统计,RSS 是驻留内存,单位为 KiB。查看线程使用 top -H -p 1234。
确认退出原因或请求正常终止
journalctl -k -b --since "1 hour ago" --no-pager
ps -p 1234 -o pid,ppid,user,lstart,stat,args内核日志可查看 OOM 等事件,应用退出原因还可以查对应的服务日志。
systemd 服务通过 systemctl 停止。独立进程先核对 PID 和命令,再发送 TERM。
kill -TERM 1234
# 等待应用完成清理后再检查
ps -p 1234 -o pid,ppid,user,lstart,stat,argsTERM 请求程序正常退出;KILL 会跳过清理过程。
处理服务启动失败与配置更新
以下使用 nginx.service。
查看状态、日志与启动配置
systemctl status nginx.service --no-pager -l
journalctl -u nginx.service -b --since "30 minutes ago" -n 100 --no-pager
systemctl cat nginx.service查看本次失败的时间、退出状态和错误行。-b 限定为本次系统启动的日志。
校验应用配置并选择生效方式
sudo nginx -t配置校验通过后,正在运行的服务可用 reload 重新加载。
sudo systemctl reload nginx.service服务未运行时使用 start。
sudo systemctl start nginx.service需要重启进程时执行 sudo systemctl restart nginx.service。修改 unit 文件后先执行 sudo systemctl daemon-reload,再启动或重启服务。
验证服务状态与实际请求
systemctl is-active nginx.service
journalctl -u nginx.service --since "5 minutes ago" -n 50 --no-pager用 journalctl -u nginx.service -f 持续查看日志。systemctl is-enabled nginx.service 查询是否开机启动。
排查服务端口与访问失败
按监听地址、本机请求、域名访问的顺序检查。
确认监听地址与对应进程
ip -br address
ss -lntp 'sport = :8080'
# 需要查看 UDP 时使用
ss -lnup-l 查看监听,-n 显示数字地址,-t 为 TCP,-u 为 UDP,-p 显示进程。监听在 127.0.0.1 的服务只接受本机 IPv4 访问。
从本机发送有超时限制的请求
curl --noproxy '*' -sS -D - -o /dev/null --connect-timeout 2 --max-time 5 http://127.0.0.1:8080/health发送 GET 请求,显示响应头并丢弃响应体。脚本需要把 HTTP 404、500 视为失败时,加 --fail。
服务绑定内网地址时请求该地址;按域名区分站点的服务还要设置 Host。
curl --noproxy '*' -sS -D - -o /dev/null --connect-timeout 2 --max-time 5 -H 'Host: example.com' http://127.0.0.1:8080/health对比域名访问与本机结果
curl -sS -o /dev/null --connect-timeout 3 --max-time 10 -w 'status=%{http_code} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} total=%{time_total}\n' https://example.com/health
ss -tan state established计时值从请求开始累计。本机正常、外部失败时,继续查 DNS、反向代理、防火墙和云安全组。
其他
定位命令与查看帮助
command -v java
type -a java
printf '%s\n' "$PATH"
ls --help
man findcommand -v 定位命令,type -a 列出别名、函数和同名程序。
保存输出并保留错误信息
# > 会覆盖同名文件,执行前确认输出路径
./scripts/check.sh > check.log 2>&1
check_status=$?
printf 'exit=%s\n' "$check_status"
tail -n 50 check.log> check.log 2>&1 把标准输出与标准错误写入同一文件;>> 用于追加。立即保存 $?,否则后续命令会覆盖退出状态。重定向顺序会影响结果。
既要显示又要保存时可用 tee。Bash 默认取管道最后一条命令的状态,启用 pipefail 后任一阶段失败会使管道返回非零。
( set -o pipefail; ./scripts/check.sh 2>&1 | tee check.log )
check_status=$?
printf 'exit=%s\n' "$check_status"生成与校验文件摘要
sha256sum app.tar.gz > app.tar.gz.sha256
sha256sum -c app.tar.gz.sha256在摘要清单对应的目录中执行校验,检查文件是否在传输中发生变化。