算起来,Linux常用命令这个系列写到第十篇了。前面九篇零零散散讲了文件操作、权限管理、进程控制、网络排查这些,每一篇都是我在真实环境里用过的、踩过坑之后沉淀下来的东西。这篇我也不打算搞什么宏大叙事,继续走实用路线,把最近半年在服务器上高频用到、以及一些容易被忽略但关键时刻能救命的命令整理出来。
说句实在话,Linux命令这东西,看一百遍不如自己敲一遍,但敲之前得知道该敲什么、为什么这么敲。所以这篇文章我尽量把每个命令的使用场景、参数含义、坑点都讲明白。无论你是刚接触Linux的新手,还是已经有几年经验的运维或开发,下面的内容应该都能让你有收获。
1. 文件与目录操作:从基础到高效的心法
1.1 高频文件操作命令的进阶用法
老生常谈的ls、cd、cp、mv、rm我就不从头讲了,直接说几个容易被忽视的进阶用法。
ls命令,我们一般用ls -l看权限,用ls -a看隐藏文件,但真正高效的用法是组合:
bash复制ls -lhtr
这条命令把文件按修改时间倒序排列,-t按时间排序,-r反转顺序。它的价值在于,你面对几十个文件想知道哪些是最近改动的,一眼就能扫出来。我在排查生产环境问题的时候,第一步往往就是进到日志目录执行它,看看哪个日志文件刚刚被写入,马上就能定位到大致的出问题时间窗。
cp命令,绝大多数人只知道cp -r递归复制,但真正做增量同步或者备份的时候,我更推荐:
bash复制cp -av source_dir/ target_dir/
-a是归档模式,等于-dpR的组合,会保留文件权限、属主、时间戳。-v是显示进度。这个组合在做目录迁移的时候非常好用。但注意,cp不擅长处理"大量小文件"和"增量同步"场景,这种场景应该交给rsync:
bash复制rsync -av --progress source_dir/ user@remote_host:/backup/
rsync的增量传输是算法层面的,它会把文件切成数据块做校验,只传输变化的部分。我遇到过几次"生产环境磁盘快满了临时做数据迁移"的情况,如果直接cp会把IO打满,但rsync --bwlimit=2048可以限制带宽,把对线上服务的影响降到最低。
再说删除。rm -rf是操作系统的核按钮,按下之前必须三思。但在实际工作中,我更习惯用mv到一个临时目录代替直接删除:
bash复制mkdir -p /tmp/trash
mv dangerous_file /tmp/trash/
这样就算删错了也能救回来。等确认没问题了,再真正清理/tmp/trash。这不是胆小,是吃过亏之后的肌肉记忆。有一次我在客户服务器上清理旧日志,把log_bak目录当成备份目录直接rm -rf了,后来发现真正的日志备份全在里面,好在当时是mv而不是rm,才能完整恢复。从那以后,凡是不确定能不能删的文件,一律先mv再做二次确认。
1.2 查找与搜索:find、grep的核心参数
find命令是Linux里最强大的文件查找工具,没有之一。关键是很多人的用法停留在find / -name "*.log"这种层面,碰到权限报错刷屏直接懵掉。正确姿势是:
bash复制find /var/log -name "*.log" -type f -mtime +30 -exec rm {} \;
解释一下:-type f限定只找文件(不找目录),-mtime +30表示30天之前修改过的,-exec rm {} \;是对找到的每个文件执行删除。这个组合常用于清理过期日志。
另一个高频组合是find配合-size来排查磁盘占用的元凶:
bash复制find / -xdev -type f -size +1G -exec ls -lh {} \;
-xdev的意思是不要进入其他文件系统,这是关键参数。不加它的话,find /会遍历/proc、/sys这些虚拟文件系统,不仅慢,还会报一堆没意义的错误。加-xdev之后只在当前根文件系统里找,速度提升几个量级。我曾经在一台磁盘100%的服务器上用它,五分钟就揪出了那个占据30GB空间的core dump文件。
grep命令,我用得最多的场景是查日志:
bash复制grep -n "ERROR" app.log
但生产环境日志动辄几个GB,直接grep会把整个文件读一遍,慢得让人抓狂。我会先用grep -c统计一下错误出现的数量,如果数量巨大,说明问题是大面积爆发,直接grep -m 100限定只显示前100条就够了,不需要把几万行错误全打出来。另外这两个参数也非常常用:
bash复制grep -A 5 "Exception" app.log # 显示匹配行的后5行
grep -B 5 "Exception" app.log # 显示匹配行的前5行
排查程序崩溃的原因时,只看异常本身的上一行往往能发现是哪个调用导致的,只看下一行能知道异常传播到了哪里,-B和-A配合用,大概能覆盖80%的日志排查场景。
1.3 文本处理三兄弟:sed、awk、cut
这三个命令是Linux文本处理的基石,我分别说一个最常用的场景。
sed做替换,格式是:
bash复制sed -i 's/old_string/new_string/g' config.conf
-i是原地修改,g是全部替换。没有-i的话sed只把结果打印出来,文件本身不变,用于预览非常方便。我的习惯是先用不带-i的命令跑一遍确认输出正确,再真正加-i执行,避免改坏配置文件。
awk是列处理神器。比如查看nginx访问日志里哪些IP访问最多:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
这段命令把日志第一列(IP)提取出来,sort排序,uniq -c统计每个IP出现次数,再按次数排序,head -20显示前20名。对于快速判断是否存在恶意扫描非常有帮助。
cut简单直接,按分隔符切列。比如从/etc/passwd里提取所有用户名:
bash复制cut -d: -f1 /etc/passwd
-d:指定冒号为分隔符,-f1取第一列。这个命令比awk -F: '{print $1}'更快,适合处理超大文件——如果一次要处理的文本是几GB的纯日志,别用awk,cut的效率是它的好几倍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 用户与权限管理:从跟头到认知的完整转换
2.1 新建用户与用户组管理
热词里有"linux新建用户",说明这是很多人的刚需。实际上useradd的坑不少,我一个个说。
最简单的创建用户并设置密码:
bash复制useradd zhangsan
passwd zhangsan
但这样创建出来的用户默认没有家目录。很多新手第一次用useradd建用户,然后su切换过去发现找不到home,就是这个原因。正确的创建方式是加上-m参数:
bash复制useradd -m -s /bin/bash zhangsan
-m自动创建家目录,-s指定登录Shell为bash(默认可能是sh,用起来很别扭)。创建之后验证一下:
bash复制id zhangsan
这条命令会输出用户的UID、GID以及所属的附加组,这是排查权限问题要用到的第一条命令。
用户和用户组的关系也值得多说一句。useradd默认会创建一个和用户名同名的组,这个组叫基本组。此外用户还可以加入多个附加组,用usermod搞定:
bash复制usermod -aG docker zhangsan
-aG是追加到组,不加-a的话会把用户从其他附加组里全部移除,这个参数常被忽略,结果就是用户之前加的组权限全没了,排查半天才发现是这个问题。
删除用户的时候也一样,最安全的做法:
bash复制userdel -r zhangsan
-r会一并删除家目录和邮件池,否则会残留大量垃圾文件。不过userdel不会删除和该用户同名的组,如果确定不需要了得手动groupdel。
2.2 文件权限的本质:rwx和数字法
Linux权限体系,一句话说清楚:每个文件有属主(owner)、属组(group)、其他人(others)三组权限,每组权限有读(r=4)、写(w=2)、执行(x=1)三种。
为什么chmod 755代表属主可读写执行、属组和其他人只能读执行?因为7=4+2+1,5=4+1。这个数字法本质上是二进制位的十进制表示,理解了这一点就永远不会算错。
实际排障中,我遇到最多的问题不是chmod本身,而是某种服务明明装好了却报"Permission denied"。这时候三步走:
bash复制ls -l /path/to/file # 看属主属组和权限位
whoami # 确认当前用户是谁
id # 确认用户属于哪些组
三步对照完,权限问题基本都能定位。比如-rw-r--r--表示属主可读写,其他人只读,如果你的服务以非属主用户运行但需要写文件,必然报错。解决办法要么chown改属主,要么chmod g+w给属组加写权限,要么用usermod -aG把运行用户加进文件属组。
2.3 sudo权限配置:编辑sudoers的避坑方法
给某用户sudo权限,正规做法是编辑/etc/sudoers,但绝对不能直接vim /etc/sudoers去改,因为一旦语法写错,系统里所有人都无法再用sudo,而你此时可能已经断开了ssh连接,那基本只能靠重启进单用户模式来救。
正确姿势:
bash复制visudo
visudo有两个好处:一是打开文件前会锁定,防止多人同时编辑冲突;二是保存时会做语法校验,格式错了会阻止你的保存操作。下面是一个安全的配置示例:
code复制zhangsan ALL=(ALL:ALL) ALL
这行的含义是:用户zhangsan可以从任意终端、以任意用户身份、执行任意命令。如果只想允许特定命令,可以写成:
code复制zhangsan ALL=(root) /usr/bin/systemctl, /usr/bin/docker
这个配置只允许用户用systemctl和docker这两个命令,权限控制更精细。日常运维的原则是"最小权限",能不给root就不给root,sudo的命令白名单比直接给ALL安全得多。
3. 系统状态查看与监控:没这些命令寸步难行
3.1 查看系统版本、负载和内核信息
热词里有"linux查看cache版本",这里推测指的是查看系统运行时缓存的内存情况,也有可能是指查看某软件的缓存版本。无论哪种,都得先会用系统状态的查看命令。
查看系统基本版本信息:
bash复制uname -a
cat /etc/os-release
uname -a输出内核版本、主机名、架构等信息,/etc/os-release显示发行版名称和版本号,比如Ubuntu 22.04、Rocky Linux 9.x等。这两个命令在排查"为什么我在CentOS上装一个包,命令却变成了dnf"这种问题时特别好用,本质原因就是不同发行版用了不同包管理器。
查看CPU和内存状态:
bash复制top
top是交互式的进程查看器,但很多人的用法只是看一眼就关了,其实它可以按内存排序、按CPU排序、过滤进程。进入top之后:
- 按
M:按内存使用率排序 - 按
P:按CPU使用率排序 - 按
u然后输入用户名:只显示该用户的进程 - 按
k然后输入PID:杀掉指定进程
这四招掌握了,大部分进程排查的基本功就有了。用top看系统的平均负载,重点看1分钟、5分钟、15分钟三个数值。如果1分钟数值远高于15分钟,说明系统刚刚开始变繁忙,要及时处理;如果三个数值都很高,说明已经持续高负载一段时间了,要立刻定位原因。
3.2 磁盘与内存:df、du、free的互补用法
df查看磁盘分区的整体使用率,du统计目录和文件占用的实际大小。这两个命令看起来类似,其实是互补的。df -h看到的是文件系统层面,du -sh看到的是目录层面。举一个我常用的排障组合:
bash复制df -h
看到/dev/vda1使用率100%之后,接着用:
bash复制du -xhd1 / 2>/dev/null | sort -rh | head -10
这个命令的含义是:-x不跨文件系统,-h人性化显示大小,-d1只统计一层子目录,2>/dev/null把没有权限访问的目录错误信息丢掉,sort -rh按人类可读数字反向排序,head -10显示前10个。它能在几秒内告诉你根目录下到底哪个目录最占空间,然后层层递进就能找到元凶。
free -h查看内存,重点看available这一列,它才是真正可用的内存总量。判断系统是否内存不足,不要只看free那一列,因为Linux会尽量把空闲内存用作文件缓存,buff/cache占得多并不代表内存不足,available会综合考虑可回收的缓存,所以它才是最可靠的指标。
3.3 网络与端口排查:ss和netstat的实战对决
netstat是传统命令,ss是它的现代替代品。现在很多新系统里netstat默认不再安装,需要装net-tools,而ss来自iproute2,基本所有系统都自带。所以我的建议是直接用ss。
查看当前所有监听端口和对应的进程:
bash复制ss -lntp
-l只显示监听状态的socket,-n不解析服务名直接显示端口号,-t限制为TCP,-p显示占用进程。输出里可以看到哪个进程占了哪个端口,排查"端口被占用"问题时这是第一命令。
如果要看完整的连接状态,特别是排查连接数过多的问题:
bash复制ss -ant state established | wc -l
这条命令统计当前所有已建立的TCP连接数。系统负载不高但服务响应慢,去查一下连接数往往会有发现,要么是连接没有正常释放,要么是遭遇了C10K问题。
另外,查看某个端口是否被防火墙挡住,可以用:
bash复制nc -vz 192.168.1.10 8080
-v显示详细信息,-z表示只扫描不发送数据。能通的话输出Connection succeeded,不通则报错。用它测试网络连通性比telnet直观很多,而且nc在几乎所有Linux发行版都有,不需要额外安装。
4. 软件安装与服务管理:从包管理器到systemd的运维速查
4.1 不同发行版的包管理器对照
热词里出现了"linux安装python"、"linux安装nginx"、"docker常用命令"等,这些都涉及软件安装。有个基本的理念得先立住:不同Linux发行版用的是不同的包管理器,命令差异挺大。
| 发行版系 | 包管理器 | 安装软件 | 搜索软件 | 更新软件 |
|---|---|---|---|---|
| Debian/Ubuntu | apt | apt install nginx |
apt search nginx |
apt update && apt upgrade |
| RHEL/CentOS/Rocky | dnf/yum | dnf install nginx |
dnf search nginx |
dnf update |
| Arch | pacman | pacman -S nginx |
pacman -Ss nginx |
pacman -Syu |
新手最容易犯的错误是,在Ubuntu上用yum,或者在CentOS上用apt,结果报错command not found。看到这个报错先别慌,用cat /etc/os-release看下系统是什么发行版,然后换对应命令就行。
以安装Python为例,在Ubuntu上:
bash复制apt update
apt install -y python3 python3-pip
-y参数自动确认,避免交互式提示卡住脚本。这里的教训是:安装Python3时系统自带的python3-pip版本可能比较旧,但能满足大部分基础场景。如果你需要特定版本的Python(比如3.11),我的建议是不要动系统自带的Python环境,另外装一个独立的版本管理工具。
而安装nginx,用包管理器往往装到的是发行版仓库里的固定版本,版本较旧。如果对版本有要求,更推荐用nginx官方仓库:
bash复制# 以Ubuntu为例
apt install -y curl gnupg2 ca-certificates lsb-release
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" > /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | apt-key add -
apt update
apt install nginx
这套操作的本质是:把nginx官方的软件源加到系统里,优先从官方源拉取最新版本,而不是用发行版仓库里的老版本。
4.2 systemd服务管理:start、enable、status的黄金组合
现代Linux发行版都用systemd管理服务,操作服务的规矩如下:
bash复制systemctl start nginx # 启动服务
systemctl enable nginx # 设置开机自启
systemctl status nginx # 查看服务状态
systemctl restart nginx # 重启服务
systemctl reload nginx # 重载配置(不中断服务)
这里有个细节:reload和restart的区别很大。reload是让服务在线读取新配置文件,不中断对外的连接;restart会先停掉进程再重新启动,会短暂断开所有连接。对于nginx这类可以热加载的服务,修改配置后第一选择永远是reload而不是restart,这样可以做到零感知变更。
排查服务问题时,status的输出信息量很大:
bash复制systemctl status nginx
如果服务启动失败,输出里会直接显示Active: failed,而日志信息在journalctl里:
bash复制journalctl -u nginx -n 50 --no-pager
-u指定服务单元,-n 50显示最后50行日志,--no-pager直接输出不用翻页。这套组合可以解决绝大多数的服务启动失败问题,比看/var/log里的日志更快更全面。
4.3 Docker与K8s常用命令速查
热词里出现"docker常用命令"和"k8s常用命令大全",这两个是当下运维领域的必选项。docker的命令体系并不复杂,记住一条主线和几个关键参数就行。
docker镜像相关:
bash复制docker pull nginx:latest # 拉取镜像
docker images # 查看本地镜像列表
docker rmi nginx # 删除镜像
docker容器相关:
bash复制docker ps -a # 查看所有容器(包括已停止的)
docker run -d --name web -p 8080:80 nginx
docker exec -it web /bin/bash # 进入容器终端
docker logs -f web # 实时查看容器日志
docker inspect web # 查看容器的详细配置信息
docker run的参数是重点:-d后台运行,--name指定容器名,-p 8080:80把宿主机的8080端口映射到容器内的80端口,-it是交互式终端。故障排查时,docker logs -f是第一步,先看程序打印了什么错误;docker inspect可以看网络、挂载卷、环境变量等详细信息,是排查配置问题的重要帮手。
k8s的常用命令,最核心的是这组:
bash复制kubectl get pods -A
kubectl get svc -A
kubectl logs -f pod_name -n namespace_name
kubectl describe pod pod_name -n namespace_name
kubectl exec -it pod_name -n namespace_name -- /bin/bash
如果get pods看到某个Pod状态是CrashLoopBackOff,不用慌,按顺序执行kubectl describe查看事件信息和kubectl logs查看应用日志,大部分问题都能定位。kubectl describe里Events字段会显示镜像拉取失败、探针检查失败、资源不足等原因,这是排查Pod问题的第一入口。
5. 常见问题排查与避坑技巧
5.1 命令找不到与sudo环境变量问题
"command not found"是最常见的报错之一,但有两种情况:一是软件真的没装,二是命令存在但路径不在PATH里。比如我自己就多次遇到过:登录服务器的普通用户执行systemctl报command not found,其实是因为普通用户的PATH不包含/usr/sbin,而systemctl就在那里。
这类问题的排查顺序:
bash复制which docker
whereis docker
ls -l /usr/bin/docker
echo $PATH
which在PATH里找命令,找不到就返回空;whereis会去固定目录搜索,可以找到不在PATH里的命令。如果命令在/usr/bin里但执行不了,可能是权限问题;如果确认命令存在但是找不到,多半是PATH配置问题。
还有一个相关坑:用sudo执行命令时,PATH会变成root用户的PATH,普通用户PATH里自定义的软件目录会消失。解决办法有两种,一种是用绝对路径调用:
bash复制sudo /home/zhangsan/.local/bin/myapp
另一种是先进入root的shell环境:
bash复制sudo -i
然后再执行命令,这里就有了root的完整PATH。另外,sudo默认不会保留普通用户设置的环境变量,比如http_proxy,这会导致某些命令在有代理的环境中正常工作,但在sudo下直接失败。需要保留的话要加上参数:
bash复制sudo -E command
-E表示保留当前环境变量,像JAVA_HOME、PATH、代理变量这类,都需要这个参数才能在sudo下继续生效。
5.2 文件系统只读与空间不足的紧急处理
服务器磁盘满了或者文件系统变成只读,这是运维事故级别的问题。先说只读,常见原因是内核检测到文件系统有异常,主动挂载为只读以保护数据。此时先别急着重启,运行:
bash复制mount -o remount,rw /
如果能重新挂载为读写模式,说明还有救,赶紧备份数据。如果这条命令都报错,那就要考虑文件系统损坏了,需要重启并进入维护模式用fsck修复。这个操作对新手有风险,建议在专业指导下执行。
磁盘满了的情况处理起来比较清晰。先找出垃圾文件,按照3.2节里du命令的方式定位大目录,然后清理。常用的清理对象有:
bash复制rm -rf /var/log/*.gz # 旧的压缩日志
yum clean all # yum/dnf缓存
apt clean # apt缓存
journalctl --vacuum-size=100M # 清理systemd日志到100M以内
docker system prune -af --volumes # 清理未使用的docker镜像、容器、卷
journalctl --vacuum-size是我特别喜欢的一个命令,因为systemd日志默认占用会不断膨胀,最多能占几十GB,绝对是在磁盘空间告急时值得先检查的项目。docker system prune这个命令会删掉所有未被使用的资源,执行前要注意确认是否还有需要的容器和镜像,运行后会给出提示,确认无误再执行。
5.3 时间同步与系统时间异常问题
数据库主从同步异常、证书校验失败、Cron任务触发时间不对,这些问题的根源往往是系统时间不准。排查时间同步状态:
bash复制timedatectl
重点关注System clock synchronized字段,如果显示no,说明时间同步服务没正常工作。手动同步:
bash复制systemctl start chronyd # 或 systemctl start systemd-timesyncd
timedatectl set-ntp true
如果用chrony,还需要看同步状态:
bash复制chronyc tracking
输出里的Leap status如果显示Normal,说明和上游时间源同步正常;如果是Not synchronised,就得去检查/etc/chrony.conf里的时间服务器配置是否可达。这个问题的隐蔽之处在于,时间偏差一两分钟不会引起关注,但一旦超过五分钟,HTTPS证书立刻失效,表现为各种不明原因的连接失败,很多人会绕很远的路去排查证书问题,最后发现纯粹是系统时间走了偏。
总结与个人经验分享
写到这里,Linux常用命令系列第十篇基本成型了。我在整理这些命令的时候有一个明显的感受:真正值钱的知识不是"这个命令怎么用",而是"遇到问题的时候,你知道该用哪个命令去下一个判断"。
以我自己的习惯,遇到服务器异常,标准的排查顺序是:先用uptime看负载,再用free -h看内存,用df -h看磁盘,用ss -lntp看端口,然后进到日志目录看最新日志。这五个动作做完,80%的问题都能有个大致的画面。
另外想分享一个小技巧,也是我最近才养成的习惯:把高频命令写成脚本放在~/bin目录,然后把这个目录加入PATH。比如我写了一个logtail.sh,一条命令就能查看某个服务的最新日志,省去了每次敲一长串journalctl -u xxx -n 100 --no-pager的麻烦。工具的价值在于简化重复劳动,而这个简化的过程,本身就是从"会用"到"用好"的分水岭。下个系列我可以专门写一期Linux效率工具的配置,那篇会更有意思。
