Linux服务器常用命令大全:文件管理、进程查看与系统维护

刚接手一台 Linux 服务器时,很多人面对黑底白字的终端会有点发怵:文件在哪、进程怎么查、服务怎么重启、日志去哪看。其实日常运维真正高频使用的命令并不算多,大概五六十条就能覆盖八成以上的场景,剩下的用 man 和 --help 现查即可。

这篇文章按真实运维场景组织命令:文件与目录、权限与属性、文本处理、压缩归档、进程与资源、系统信息、软件包管理、服务管理。每条命令都给出可执行写法和参数含义,并区分 RHEL、CentOS、Rocky 系与 Debian、Ubuntu 系在软件包管理上的差异。涉及删除、覆盖、改权限的操作都会标注风险提示,建议先在测试目录或测试机上练一遍。

先建立命令行的基本工作方式

在记命令之前,先掌握几个能让你少犯错的基本功。

第一个是看帮助。 记不清参数时不要靠猜,man ls 查看完整手册,ls --help 看简要参数,help cd 用于 shell 内置命令,type cd 可以判断一条命令是内置命令还是外部程序。

第二个是路径。 . 表示当前目录,.. 表示上级目录,~ 表示当前用户家目录,- 在 cd 中表示上一次所在目录。cd - 在两个目录之间来回切换非常好用。路径分绝对路径和相对路径,写脚本时一律用绝对路径,能避免大量因工作目录不同导致的故障。

第三个是 sudo 与权限边界。 修改系统配置、安装软件、查看其他用户进程通常需要 root 权限。推荐用 sudo 而不是长期以 root 登录,这样操作会留下审计记录。sudo -i 切换成 root shell,sudo -u nginx cat /etc/nginx/nginx.conf 以指定用户身份执行命令。

第四个是管道与重定向。 | 把前一个命令的输出交给后一个命令;> 覆盖写入文件,>> 追加写入,2> 重定向错误输出,2>&1 把错误并入标准输出,< 从文件读入。这条规则在日志排查和写脚本时天天用:

# 只保留错误输出
grep 'ERROR' app.log 2>/dev/null

# 标准输出和错误一起写入文件
/usr/local/bin/backup.sh > /var/log/backup.log 2>&1

# 同时看输出并存一份(tee)
dmesg | tee /tmp/dmesg-$(date +%F).txt

第五个是先预览再执行。 任何批量删除、批量替换、批量改权限的命令,都先用 echo 打印出将要执行的动作,确认无误后再去掉 echo。这是避免误删的第一条铁律。

文件与目录操作

这是使用频率最高的一组命令。

命令 作用 常用参数
ls 列出目录内容 -l 详细、-h 人类可读、-a 含隐藏、-t 按时间、-r 反序
cd 切换目录 无参数回家目录,- 回上一次目录
cp 复制 -r 递归目录、-a 保留属性、-p 保留时间戳
mv 移动或改名 -i 覆盖前询问、-n 不覆盖
rm 删除 -r 递归、-f 强制、-i 逐个确认
mkdir 创建目录 -p 递归创建且不报错
find 按条件查找 -name、-type、-mtime、-size、-exec
tar 打包与解包 -c 创建、-x 解包、-z gzip、-J xz、-t 查看
rsync 增量同步 -a 归档、-v 详细、--delete 删除多余、-n 演习
scp 基于 SSH 传输 -r 递归目录、-P 指定端口、-C 压缩

目录浏览与定位:

ls -lht /var/log            # 按时间倒序列出日志,大小以 K/M/G 显示
ls -la /etc/nginx           # 包含隐藏文件
cd /var/www && pwd          # 进入并确认当前路径
mkdir -p /data/backup/2026/10   # 一次创建多级目录
tree -L 2 /etc/nginx        # 树状查看(部分系统需 apt/dnf 安装 tree)

复制和移动要注意覆盖风险。cp -a 是最安全的复制方式,它会保留权限、所有者和时间戳,迁移网站目录或数据库目录时优先用它:

cp -a /var/www/html /var/www/html.bak.$(date +%F)
mv -i old.conf new.conf

风险提示: rm -rf 是不可逆操作,没有回收站。执行前务必确认路径正确,且不要把变量写空。以下写法非常危险,一旦 $DIR 为空就会变成删除根目录,必须避免:

# 危险示例,切勿执行
# rm -rf $DIR/*

# 安全的替代写法:先判断变量非空
[ -n "$DIR" ] && rm -rf "${DIR:?}/"*

查找文件用 find,它按实时文件系统扫描,比 locate 准确但慢一些:

find /var/log -type f -name '*.log' -mtime +7        # 7 天前修改过的日志
find /data -type f -size +500M                        # 大于 500MB 的文件
find /etc -maxdepth 2 -name '*.conf' -newermt '-1 day' # 一天内改过的配置
find /tmp -type f -mtime +3 -print -delete            # 先打印再删除,确认后再去掉 -print

find 与 -exec 组合能完成批量动作,但一定要先演练:

# 先预览
find /var/www -type f -name '*.php' -exec echo chmod 644 {} \;

# 确认无误后执行
find /var/www -type f -name '*.php' -exec chmod 644 {} \;

远程拷贝优先用 rsync,它只传差量,中断后可续传,比 scp 更适合大目录:

rsync -av --delete /data/www/ user@10.0.0.2:/data/www/
rsync -avn --delete /data/www/ user@10.0.0.2:/data/www/   # -n 演习,只看不做

注意 rsync 源路径末尾的斜杠含义不同:写 /data/www/ 表示同步目录内的内容,写 /data/www 表示把 www 这个目录本身同步过去。加 --delete 会删除目标端多余文件,上线前必须用 -n 演练。

scp -P 2222 ./app.tar.gz user@10.0.0.2:/tmp/
scp -r user@10.0.0.2:/var/log/nginx/ ./nginx-log/

权限与属性

Linux 权限分三级:所有者、所属组、其他人,每级有读、写、执行三种权限。用数字表示时,读是四、写是二、执行是一。

ls -l /etc/nginx/nginx.conf
# -rw-r--r-- 1 root root 1024 Oct 10 10:00 nginx.conf
chmod 644 file.conf        # 所有者可读写,其他人只读
chmod 755 /usr/local/bin/deploy.sh
chmod u+x script.sh        # 只给所有者加执行权限
chmod -R 750 /data/app     # 递归修改目录

chown nginx:nginx /var/www/html -R
chown :www-data /var/www/html -R     # 只改组
chown --reference=模板文件 目标文件   # 参照其他文件的属主

风险提示: 不要图省事执行 chmod -R 777 /,这会让系统所有文件对任何人可写,等于放弃权限模型,还可能让 SSH 因密钥权限过宽而拒绝登录。网站目录常用权限是目录 755、文件 644,需要写入的上传目录再单独放宽,并且要确认该目录不解析脚本。

默认权限由 umask 决定,root 常见是 022,普通用户常见是 002。umask 值越大,新建文件权限越保守。

umask          # 查看
umask 027      # 临时修改,仅当前 shell 有效

chattr 给文件加上文件系统级属性,可以防止误删或篡改,比权限更底层,root 也受其约束:

chattr +i /etc/passwd        # 加锁,任何人都不能改、不能删、不能重命名
lsattr /etc/passwd           # 查看属性
chattr -i /etc/passwd        # 解锁后才能修改
chattr +a /var/log/audit.log # 只允许追加,适合保护日志文件

风险提示: 给系统文件加 +i 后,软件更新、脚本写入都会失败。加固前先记录哪些文件加了锁,避免几个月后自己忘了原因。

文本处理与统计

排查故障时,大部分时间其实是在和文本打交道。

grep -n 'ERROR' app.log                 # 带行号
grep -v 'DEBUG' app.log                 # 反向过滤
grep -E 'ERROR|WARN' app.log            # 多模式
grep -R 'listen 80' /etc/nginx/         # 递归搜索目录
grep -C 3 'panic' app.log               # 同时显示上下三行
grep -c 'timeout' app.log               # 只统计命中行数

sed 用于批量替换和按行号提取。修改文件前请先备份:

sed -n '100,120p' app.log          # 打印 100 到 120 行
sed -i.bak 's/old.domain/new.domain/g' nginx.conf   # 替换并生成 .bak 备份
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
sed '/^$/d; /^#/d' nginx.conf      # 删除空行和注释行

awk 适合按列处理,是日志统计的主力工具:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 20   # 统计 Top IP
awk '$9==500 {print $7}' access.log | sort | uniq -c | sort -nr | head # 统计 500 错误的 URL
awk '{sum+=$10; n++} END {print "avg:", sum/n}' access.log             # 计算平均响应大小
awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd                  # 列出普通用户

head、tail、sort、uniq、wc 这几个简单命令组合起来非常实用:

tail -n 100 -f app.log      # 实时跟踪最新日志
tail -n +1000 app.log       # 从第 1000 行开始输出
head -n 20 app.log
sort -nr -k 3 file.txt      # 按第三列数值倒序
sort file.txt | uniq -c | sort -nr   # 统计重复次数并排序
wc -l access.log            # 行数
wc -c bigfile.iso           # 字节数

注意 uniq 只会去掉相邻的重复行,所以必须先用 sort 排序,否则统计结果偏小。

压缩与归档

tar 是最通用的打包工具,参数记忆方法是:创建用 c,解开用 x,查看用 t,gzip 用 z,bzip2 用 j,xz 用 J。

tar -czf www-$(date +%F).tar.gz /var/www/html
tar -tzf www-2026-10-10.tar.gz            # 不解包先看内容
tar -xzf www-2026-10-10.tar.gz -C /restore/ # 解到指定目录
tar -cJf big.tar.xz /data/big             # 压缩率更高,速度更慢
格式 命令 特点
gzip gzip / gunzip 速度快,压缩率中等,最通用
bzip2 bzip2 / bunzip2 压缩率略高,速度慢
xz xz / unxz 压缩率最高,CPU 开销大
zip zip / unzip 跨平台,与 Windows 交互常用

单文件压缩还可以用 gzip -k 保留原文件,zcat、zgrep、zless 可以直接查看压缩包内容,不用先解压:

zgrep 'ERROR' /var/log/nginx/access.log.2.gz
zcat big.log.gz | head -n 50

进程与资源查看

ps aux | head -n 20
ps -ef --forest                  # 树状展示父子关系
ps -eo pid,ppid,user,stat,%cpu,%mem,etime,args --sort=-%mem | head
pgrep -a nginx                   # 按名字查 PID 并显示命令行
pstree -p                        # 进程树
top                              # 交互式实时查看

top 里几个快捷键值得记住:按 P 按 CPU 排序,M 按内存排序,1 展开每个逻辑 CPU,c 显示完整命令行,H 切换线程视图,q 退出。

结束进程要分等级,先发 SIGTERM(15),给程序清理现场的机会,无效再考虑 SIGKILL(9):

kill 1234
kill -TERM 1234
kill -9 1234        # 最后的手段,不给程序清理机会
pkill -f 'python3 worker.py'
killall nginx

后台任务控制:

./long_task.sh &            # 放入后台
jobs                        # 查看后台任务
fg %1                       # 调回前台
nohup ./long_task.sh > out.log 2>&1 &   # 断开终端仍继续运行

需要更稳定的后台运行应使用 systemd 服务,而不是 nohup,因为后者在机器重启后不会自动拉起。

系统信息与软件包管理

uname -a                 # 内核与架构
uname -r                 # 只看内核版本
cat /etc/os-release      # 发行版信息,通用
lsb_release -a           # Debian/Ubuntu 常见,RHEL 系需装 redhat-lsb-core
hostnamectl              # 主机名与系统信息
hostnamectl set-hostname web-01
timedatectl              # 时区与时间同步状态
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp true
uptime                   # 运行时间与负载
who / last / w           # 当前与历史登录

时间不准会导致日志时间对不上、证书校验失败、定时任务错点执行,新机器上第一件事就应该确认时区与 NTP。

软件包管理两系差异明显:

操作 RHEL / CentOS / Rocky Debian / Ubuntu
安装 sudo dnf install -y nginx sudo apt install -y nginx
卸载 sudo dnf remove nginx sudo apt remove nginx
更新索引 dnf 自动处理 sudo apt update
升级全部 sudo dnf upgrade -y sudo apt upgrade -y
搜索 dnf search nginx apt search nginx
查文件归属 dnf provides /usr/sbin/nginx apt-file search /usr/sbin/nginx
查看已装 rpm -qa \| grep nginx dpkg -l \| grep nginx

CentOS 7 及更早版本用 yum,CentOS 8 之后、Rocky、AlmaLinux 用 dnf,两者的常用子命令基本兼容。

服务管理 systemctl

现代发行版都用 systemd 管理服务,取代了早期的 SysVinit 脚本。

systemctl status nginx --no-pager
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx          # 不中断连接重载配置,优先于 restart
systemctl enable --now nginx    # 设为开机自启并立即启动
systemctl disable nginx
systemctl is-enabled nginx
systemctl list-units --type=service --state=failed
systemctl --failed              # 只看失败的服务

修改了 unit 文件后必须执行 systemctl daemon-reload,否则改动不会生效。查看服务日志用 journalctl:

journalctl -u nginx --since '-30 min' --no-pager
journalctl -u nginx -f          # 实时跟踪
journalctl -p err -b            # 本次启动以来的错误级日志

systemd 还统一管理定时器、挂载点和 socket,例如 systemctl list-timers 可以查看所有定时任务,包括系统自带的日志轮转、证书更新等。

组合用法实战

把前面的命令串起来,才是真实运维的样子。

统计访问日志里当天请求最多的十个 IP:

awk -v d="$(date +%d/%b/%Y)" '$4 ~ d {print $1}' /var/log/nginx/access.log \
  | sort | uniq -c | sort -nr | head -n 10

找出占用磁盘最大的二十个目录:

du -h --max-depth=2 /var 2>/dev/null | sort -hr | head -n 20

批量清理七天前的压缩日志,先预览再执行:

find /var/log -type f -name '*.gz' -mtime +7 -print
# 确认清单无误后
find /var/log -type f -name '*.gz' -mtime +7 -delete

检查配置文件语法再重载,避免改错配置导致服务起不来:

nginx -t && systemctl reload nginx
sshd -t && systemctl reload sshd

一次性收集排障信息,形成快照留档:

{
  echo "=== $(date) ==="
  uptime; uname -a; free -h; df -h
  ps -eo pid,user,%cpu,%mem,args --sort=-%cpu | head -n 15
} > /tmp/snapshot-$(date +%F-%H%M).txt

常见问题

rm -rf 执行完才发现删错了,能恢复吗?

一般不能。ext4 等文件系统删除后 inode 会被回收,覆盖后数据不可恢复。能做的只有立即停止写入、对磁盘做只读镜像,再借助专业工具尝试,成功率很低。所以备份和先预览才是正解。

cp 之后权限和时间戳变了怎么办?

用 cp -a 或 cp -p。cp -a 等价于保留权限、属主、时间戳和链接,是迁移目录时的默认选择。rsync -a 同样保留属性。

find 太慢,有没有更快的方式?

可以用 locate 查文件名,它基于预建索引,速度极快,但结果可能不是最新的,需要先用 updatedb 更新索引。按内容搜索用 grep -R,搜索大目录时可以用 --exclude-dir 排除 node_modules、.git 这类无关目录。

为什么脚本里 rm -rf $DIR/* 很危险?

因为变量为空或含空格时,命令会被 shell 展开成完全不同的含义,最坏情况会删除根目录。应始终给变量加双引号,用 ${DIR:?} 在变量未设置时直接报错退出,并在删除前用 -print 预览。

chown -R 会不会把系统搞坏?

对 /usr、/etc、/lib 这类系统目录递归改属主,会导致系统命令无法执行、服务无法启动。只对业务数据目录操作,操作前确认路径拼写,批量操作前先备份权限清单。

总结

  • 记命令不如记场景:按文件、权限、文本、进程、系统信息、软件包、服务七类组织,遇到需求先归类是哪一类,再回忆对应工具。
  • 所有破坏性命令都要遵守先预览后执行的流程,find 用 -print、rsync 用 -n、sed -i 加备份后缀,能挡住绝大多数事故。
  • 权限不要图省事用 777,网站目录按目录 755、文件 644 配置,需要写入的目录单独放宽并禁止脚本解析。
  • 服务操作优先用 systemctl reload 而非 restart,重载前先用 nginx -t、sshd -t 校验语法,能避免配置错误导致服务中断。
  • 建立自己的命令速查笔记,把常用的组合命令保存成脚本或 alias,重复三四次的操作都应该脚本化。