☰
Linux用户权限与进程服务管理实战:从入门到进阶
2026/10/21 16:08:36 网站建设 项目流程

这套小白实战学习Liunx的系列终于写到第六篇了。先替大家纠正一下:标题里的Liunx其实就是Linux,当年手滑多打了一个字母,后来干脆将错就错,反而成了这个系列的标志。前五篇我们把基础的命令操作、文件与目录管理、文本处理、网络配置这些内容都过了一遍,按理说你已经能一个人对着服务器敲不少命令了。但说实话,光会敲命令离"会用系统"还有一段距离——你会发现真正干活的时候,绕不开用户权限、进程管理和系统服务这三座大山。

所以这一篇咱们把重点放在三个实战高频主题上:用户与用户组管理、文件权限进阶、进程管理与系统服务。这三块是新人从"会操作"进阶到"会管理"的必修课。文章里所有的命令和操作思路,都是我这些年在一线环境里验证过的,也会把踩过的坑一并说出来。你不需要提前准备多高深的基础,前五篇的内容能跟上,这篇就没问题。跟着我一步步敲,看完再动手,效果会好很多。

1. 用户与用户组管理:打开Linux权限体系的钥匙

只要你是自己装的虚拟机,前面几篇多半是用root账号一路敲下来的。root确实爽,啥都能干,但也正因为啥都能干,系统里所有的重要文件都对你毫无防备,随手一条命令打错就可能把环境搞坏。真实生产环境里,没人会拿root满世界跑。所以理解用户、用户组和权限之间的关系,是Linux新手必须迈过的一道坎。

1.1 权限设计的底层逻辑:为什么Linux要设计用户体系

Linux天生就是一套多用户多任务系统。多用户的意思是一台机器可以同时被很多人使用,每个人都有自己独立的身份、家目录和可操作范围。多任务的意思是很多程序可以同时跑,互不干扰。要支撑起这种多人多任务的场景,系统必须能回答三个问题:你是谁、你能干什么、你在哪干活。用户体系和权限体系回答的就是这三个问题。

在Linux里,每个用户都有一个唯一的用户名和对应的UID(用户ID号)。系统真正识别的是UID,用户名只是给人看的别名。用户信息存在/etc/passwd文件里,每行一个用户,字段用冒号分隔。你可以打开文件看一眼:

cat /etc/passwd

输出内容大概是这种风格:

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin

一行里面依次是用户名、密码占位符、UID、GID、用户描述、家目录、登录Shell。注意密码字段是x,真正的密码密文存在/etc/shadow文件里,普通用户没权限看,这就保证了密码的安全性。组信息则放在/etc/group文件里,和用户文件的结构类似。

这里我用一个生活化的类比帮你理解。你可以把Linux系统想象成一家公司的办公楼,用户名相当于每个员工的工牌,UID是工牌上的编号,家目录是分配给每个员工的工位,Shell是你登录后能用的工作工具。你要进哪个区域、能开哪些门、能用哪些设备,全看你手里的这张工牌权限怎么配的。root就是这张印着"门禁全通"的最高权限工牌,平时揣兜里就好,不要天天挂在胸前。

新手的误区是觉得"用户管理"很抽象,离自己很远。实际上你去任何一家公司或者部署任何一台云服务器,第一步都是创建账号、分配权限、配置sudo,这套流程你躲不开。

1.2 实操:创建用户、设置密码、切换身份

最基础的三板斧:创建用户、设置密码、切换身份。

创建用户用useradd命令。以创建用户tom为例:

useradd tom

如果你真的照上面这样敲完,会发现用户虽然建好了,但没家目录,后面登录进去连cd ~都会出问题。所以更推荐的是加上几个常用参数一次到位:

useradd -m -s /bin/bash -d /home/tom tom

这里三个参数的含义分别是:

  • -m:同时创建家目录/home/tom
  • -s /bin/bash:指定登录后使用的Shell为bash,否则默认可能是/bin/sh,交互体验差很多
  • -d /home/tom:指定家目录路径

创建好之后用passwd命令设置密码:

passwd tom

系统会提示你输入两次密码。注意输入密码的时候屏幕不会显示任何字符,这是正常的,别以为键盘坏了。

再来看切换用户。从root切到一个普通用户,直接用:

su - tom

注意有个细节:su tom和su - tom是有区别的。加了-表示切换用户的同时加载该用户的环境变量和配置,相当于彻底变成这个人,工作目录也会切到他的家目录;不加-只是把身份切过去但保留当前的Shell环境。新手最容易踩的坑就是用了不带-的su,切过去之后发现命令找不到、环境怪怪的,就是因为环境变量没跟着切换。

这样切过去之后,普通用户想回到root,直接执行exit退出当前Shell就行。

普通用户想临时以root身份执行某条命令,就得靠sudo。让一个用户拥有sudo权限,需要把该用户加入sudo组(不同的发行版组名不同,Debian/Ubuntu系是sudo,CentOS系是wheel):

usermod -aG sudo tom

之后tom执行命令时在开头加sudo就能以管理员权限运行,系统会提示输入tom自己的密码确认身份。这个设计很巧妙,不用把root密码告诉别人,又能精准地授权。

1.3 用户组管理:用组来批量分配权限

用户组的意义在于批量管理。想象一下公司里有20个开发,如果一个个单独配权限,管理员会累死。更好的做法是先建一个"开发组",把这20个人都拉进组里,然后只给组配权限,所有人自动生效。这就是用户组存在的价值。

常用命令就三个:

groupadd devteam usermod -aG devteam tom groups tom

第一条命令创建新组devteam,第二条把tom加进去,第三条查看tom当前所属的所有组。这里务必注意,usermod -G和usermod -aG的区别:-G是"把用户的主组之外的附加组换成指定的组",如果你只敲usermod -G devteam tom,会把用户原本加过的其他组全部顶掉;-aG是在原有组的基础上追加,这个-a真的不能省。我见过不少老手都在这上面犯过迷糊。

删除用户的时候用userdel,推荐加-r参数把家目录和邮件目录一起删掉:

userdel -r tom

千万别直接手动去删/home/tom目录而不删账号,那样会产生"僵尸目录",每次看到都像是把前一个人的工位留着没人坐。

1.4 小白最容易踩的四个用户管理坑

有些问题不是你敲错命令才出现的,而是命令本身的细节没注意。我这些年带过不少新人,用户管理这块翻车率最高的场景就四个:

第一个坑是创建的普通用户没有Shell。如果你用useradd的时候没指定-s,某些系统会默认分配给用户一个/usr/sbin/nologin作为Shell。这个Shell的唯一作用是拒绝登录。你辛辛苦苦建好的账号,一登录就提示This account is currently not available,检查一通发现就是Shell配错了。解决办法就是用usermod -s /bin/bash 用户名改回来。

第二个坑是sudo执行报"is not in the sudoers file"。这个其实是正常的,说明该用户确实不在sudo组里。你切回root,执行usermod -aG sudo 用户名,再切换回去就正常了。如果你非要去手动修改/etc/sudoers文件,记住一定要用visudo命令打开,千万别直接用vim改,因为visudo会帮你做语法检查,万一你写错了还能保留一个语法正确的副本兜底。

第三个坑是给用户设置了密码但登录时报"密码已过期"。这种情况往往出现在用chage -d 0 用户名强制用户下次登录修改密码之后。处理方式很简单,用root执行chage -d指定一个过去的日期,或者直接设置一个新密码,再让用户登录。

第四个坑是不知道如何查看系统里有哪些用户。最直接的办法是看/etc/passwd文件,但里面会包含大量系统内置账号。日常管理用getent passwd配合cut手动筛一下UID 1000以上的真实用户,或者直接用ls /home看有哪些家目录,基本就能判断出哪些账号是人为创建的。

用户管理这块内容,你先做到能建用户、能删用户、能加组、能配sudo,就已经能应对九成以上的日常工作场景了。

2. 文件权限进阶:rwx背后是一套完整的安全模型

权限是Linux安全性最核心的基石。前面几篇我们提过ls -l会显示文件权限,但很多小白只是看了一眼,根本没细想那串drwxr-xr-x到底代表什么。这一节我们把权限拆开揉碎讲清楚,再补上特殊权限位和共享目录的实战案例。

2.1 从ls -l看懂那一串奇怪的字符

随便找一个目录执行ls -l,你会看到类似下面的输出:

drwxr-xr-x 2 root root 4096 Mar 12 10:30 test

第一列drwxr-xr-x是对这个文件/目录权限的完整描述,一共10个字符,可以分成四部分来记:

第一部分是第1个字符,表示文件类型。d是目录,-是普通文件,l是软链接,b是块设备,c是字符设备。

第二部分是第2到第4个字符,表示属主的权限,也就是文件所有者。

第三部分是第5到第7个字符,表示属组的权限。

第四部分是第8到第10个字符,表示其他用户的权限。

每一组里的r表示读权限,w表示写权限,x表示执行权限。对应到数字上的权重分别是4、2、1。注意顺序永远是rwx,没有哪个权限就用-占位。

以test这个目录为例:drwxr-xr-x拆开看就是:类型是目录;属主可读可写可执行(rwx);属组可读可执行,没有写权限(r-x);其他用户可读可执行,没有写权限(r-x)。

这里有新手最容易卡住的地方:目录的执行权限到底是什么意思。往文件上理解,x是执行程序;但目录不是程序,目录的x权限实际代表"能否进入这个目录"。如果你想cd进一个目录,就必须有目录的x权限。只有r权限的话你可以列出目录里的文件名,但进不去也拿不到文件的详细信息。很多教程没点透这一层,导致新手第一次配置目录权限时,给了一堆r却没给x,结果目录根本进不去。

还要注意一点:文件能否被修改,看的是文件本身的写权限,而不是所在目录的写权限。但"能不能在目录里创建/删除文件"看的是目录的写权限,和文件本身的权限无关。这就是为什么有时候你明明对某个文件有写权限,却没办法在它的上级目录里新建文件,因为目录权限没给够。

2.2 修改权限的两种姿势:数字法到底怎么算

修改权限的经典命令是chmod,它有符号法和数字法两种模式。新手建议先吃透数字法,因为简洁直观、不容易出歧义。

数字法的核心是把三个权限值相加:r=4、w=2、x=1。比如要给文件设置"属主可读可写可执行、属组可读可执行、其他用户只读"的权限,先分别算:

  • 属主:rwx = 4+2+1 = 7
  • 属组:r-x = 4+0+1 = 5
  • 其他:r-- = 4+0+0 = 4

于是权限数字就是754,执行:

chmod 754 somefile

常见的几个权限组合你最好背下来:

  • 644:属主可读写,组和其他只读,这是普通文本文件的默认权限
  • 755:属主可读写执行,组和其他可读执行,这是脚本、程序、目录的常见权限
  • 700:只有属主可读写执行,组和其他无任何权限,这是私密文件的配置方式

符号法适合微调。比如给属主加上执行权限:

chmod u+x script.sh chmod g-w somefile chmod o= a.txt

第一条是属主加执行;第二条是属组去掉写权限;第三条是把其他用户的所有权限都清空,注意o=后面什么都不写就是清零。符号法的好处是不用算数字,坏处是写复杂的授权组合时会比较长。我个人的习惯是:大范围设置用数字法,单独给某个角色调整权限用符号法。

修改属主和属组用chown和chgrp:

chown tom:devteam somefile chgrp devteam somefile

第一条命令把somefile的属主改成tom、属组改成devteam。注意chown tom:devteam这个写法中间用的是冒号,不要写成逗号或者空格,不然命令会直接报错。

2.3 特殊权限位:SetUID、SetGID和粘滞位

除了常规的rwx,Linux还保留了三个特殊权限位。这三个位平时不太显眼,但关键时刻作用非常大,也很容易在小测和面试里考到。

第一个是SetUID(set uid,用s代替属主的x位置)。它的含义是:用户执行这个程序时,会临时获得该文件属主的权限。最典型的例子是/usr/bin/passwd命令。普通用户要修改自己的密码,而密码是存在只有root能读写的/etc/shadow文件里的,这就冲突了。解决办法就是给passwd命令设置SetUID权限,让普通用户执行它时临时提升为root身份,从而能改/etc/shadow。你可以执行:

ls -l /usr/bin/passwd

大概率会看到-rwsr-xr-x,那个s就是SetUID。

第二个是SetGID(set gid,用s代替属组的x位置)。它在文件上的作用是:执行程序时临时获得该文件属组的权限;在目录上的作用不一样:任何用户在目录里新建的文件或子目录,其属组会自动继承目录的属组。这个特性用来做团队共享目录非常方便,后面实战会用到。

第三个是粘滞位(sticky bit,用t代替其他用户的x位置)。它现在最经典的应用场景就是/tmp目录。/tmp是任何人都能写的临时目录,但如果不加控制,用户A可以随便删除用户B放进去的文件,这必然乱套。粘滞位的作用就是:目录里的文件只能被文件属主、目录属主或root删除/重命名,其他用户即使对这个目录有写权限,也没法乱动别人的文件。你看一下/tmp的权限,大概率是drwxrwxrwt,最后的t就是粘滞位。

这三个特殊权限位都可以用chmod设置:

chmod u+s /path/to/file # 设置SetUID chmod g+s /path/to/dir # 设置SetGID chmod +t /path/to/dir # 设置粘滞位

数字法里它们分别有独立的权重值:SetUID是4、SetGID是2、粘滞位是1,放在权限数字的最前面。比如要给一个目录设SetGID,同时普通权限是755,就是chmod 2755 dirname。

2.4 实战:搭建一个多人共享目录

前面讲了那么多权限位,现在把它们串起来做个真实场景。假设你们部门三个同事共用一个服务器,要搭建一个共享工作区,要求是:大家都能在里面创建和编辑文件,但不能删别人的文件,新创建的文件自动归到共享组下。

目标明确了,步骤其实就五步。

第一步,创建共享组和成员:

groupadd shared usermod -aG shared tom usermod -aG shared jerry usermod -aG shared bob

第二步,创建共享目录并设置基础权限:

mkdir /srv/shared chown root:shared /srv/shared chmod 770 /srv/shared

770的含义是:属主root可读可写可执行,属组shared可读可写可执行,其他用户什么都干不了。这确保只有shared组的成员能进这个目录。

第三步,给目录设置SetGID:

chmod g+s /srv/shared

这一步很关键。加了SetGID之后,成员在目录里新建的任何文件,属组都会自动变成shared,不需要每次手动chgrp,省了太多事。

第四步,给目录设置粘滞位:

chmod +t /srv/shared

这样成员可以往里面放文件、编辑自己的文件,但删除别人的文件会被拒绝。加上前面两层,目录权限最终显示为drwxrwsr-x+之类的组合,具体显示取决于你的umask设置。

第五步,测试验证。切换成tom用户,在/srv/shared下建个文件,用ls -l看看属主和属组是不是tom shared,再尝试删掉jerry的文件,看系统是否提示权限不足。

关于umask再补充一句:它是决定新文件默认权限的遮罩值。通常系统默认umask 022表示文件默认644、目录默认755。共享目录场景下你可能希望成员新建文件能被组内伙伴编辑,可以在每个成员的家目录配置文件里把umask改为002,这样新文件权限变为664,组内可写。这个细节很多人想不到,等你真的搭了共享目录就会发现非常实用。

3. 进程管理:看见系统的实时状态

很多小白反映"学了Linux却感觉对系统没有掌控感",问题往往出在不会看进程。你执行一条命令,命令结束了就结束了,完全不知道它的计算过程在哪发生、哪一步卡住了。进程管理就是把你和系统运行状态连接起来的一扇窗。

3.1 进程到底是个啥:从程序到进程

程序是磁盘上静止的文件,你写了一个test.py放在硬盘里,它只是个文件而已。进程是程序被加载到内存后正在运行的那个实例,有自己独立的PID(进程号)、内存空间和运行状态。你能看到的一个个任务、服务、命令,背后都是一个个进程。

每个进程都有父进程。你从bash里敲一条ls命令,bash就是父进程,ls是子进程。用pstree命令可以看到这种父子关系,就像一棵倒挂的树。进程状态也有讲究,常见的状态对应字母:R表示正在运行,S表示可中断的睡眠,D表示不可中断的睡眠(多半在等磁盘IO),Z是僵尸进程(进程死了但没被父进程清理,还残留一条记录),T是停止。看到Z别慌,大部分情况下是父进程没处理,过会儿就会被收掉;但如果僵尸进程持续堆积,就要排查是不是父进程有bug。

3.2 ps查进程、kill杀进程的完整实操

查看进程最常用的两条命令:ps aux和ps -ef。从使用习惯来说,Debian系老哥多用ps aux,CentOS/RHEL系老哥多用ps -ef,功能大同小异,都能看到PID、CPU、内存、进程名等信息。

我建议小白从ps aux入手,执行看看输出:

ps aux

输出中有几列值得关注:USER是进程属主,PID是进程号,%CPU和%MEM是CPU和内存占用百分比,VSZ和RSS是虚拟内存和实际物理内存占用,STAT是进程状态,COMMAND是完整的执行命令。

实际工作中经常需要"找到某个进程"。比如你怀疑某个Python脚本在占用大量CPU:

ps aux | grep python

用管道把ps aux的输出丢给grep过滤,再通过PID精确管理。

杀进程用kill,最朴素的用法是:

kill PID kill -9 PID

第一条是礼貌地请求进程结束,相当于发一个SIGTERM信号,进程还能做清理工作然后退出。第二条直接暴力干掉,发送SIGKILL信号,不给进程任何反应机会。新手常见的错误是一上来就kill -9,结果进程留下的日志、临时文件、数据库锁全乱了。我的建议是:先用不带-9的方式杀,观察几秒杀不掉再上-9,这跟和人沟通是一个道理,先好好说,不行再翻脸。

如果你知道进程名的关键字,可以用pkill或killall按名字杀:

killall -9 test.py pkill -f "test.py"

pkill -f会按完整命令行匹配,比killall灵活得多。

给你一个高频实战场景:某个端口被占用了怎么处理。假设8000端口被占用:

ss -ltnp | grep 8000

输出里会显示占用的PID,比如PID是23456,然后:

kill 23456

再用ss -ltnp | grep 8000确认端口已经释放。

3.3 前台与后台:把命令扔到后台跑

终端里执行的命令默认都在前台,你要么等它跑完,要么按Ctrl+C中断。但很多任务(比如跑一个耗时很长的脚本)没必要一直占着终端,这时候就要用到后台管理。

把命令丢到后台最直接的方式是在命令末尾加&:

/media/backup.sh &

命令会立刻返回控制权给你,屏幕上显示一个后台作业编号和PID。此时终端已经空了,你还能继续敲其他命令。

如果命令已经开始跑了,你才意识到想把它放后台,按Ctrl+Z把进程暂停,然后执行:

bg

它就转到后台继续运行了。这里有个区分:Ctrl+Z是暂停,bg是转为后台运行。如果你只是想把它捞回前台,用fg;后台暂停的作业也可以用fg捞回前台继续。

用jobs -l查看当前终端所有的后台作业列表。这里必须提醒一个坑:如果你关闭终端,后用&或者bg放后台的进程很可能一起被杀掉。解决办法是使用nohup命令,意思是"忽略挂断信号":

nohup /media/backup.sh &

这样即使终端关闭,进程也会继续跑。配合日志重定向来用更清晰:

nohup /media/backup.sh > /tmp/backup.log 2>&1 &

这条命令的意思是:把标准输出写到/tmp/backup.log,错误输出也写到同一个文件(2>&1),整个进程在后台运行且不受终端关闭影响。这是在各种环境下执行长任务的经典姿势,强烈建议背下来。

3.4 top工具:实时监控系统别只会按q

ps是看某个瞬间的快照,想看实时变化就得用top。执行:

top

界面第一屏显示的是当前时间、运行时长、登录用户数和负载平均值(load average)。负载平均值有3个数字,分别表示过去1分钟、5分钟、15分钟的平均负载,单位是"多少个任务在排队等待运行"。判断系统是否过载,不能只看CPU使用率,重点看负载。比如一台4核机器,负载长期在4以上,说明任务总是排满,已经逼近极限了;如果长期在1以下,说明CPU资源富余。

往下看是进程列表,按CPU占用从高到低排列(默认是按CPU排序,按M键可以切换成按内存排序)。里面每一列的%CPU表示该进程占用的CPU百分比。

top里还能直接管理进程:按k输入PID,再按9回车就是发送SIGKILL信号杀进程;按r可以调整进程的优先级(nice值)。q是退出,也是很多小白唯一会的按键。

如果不想看这个界面,还有更简洁的htop,它是top的增强版,支持鼠标操作、树状显示、颜色区分,用起来更直观。但htop默认没装,你得先apt install htop或yum install htop。在真正的服务器排障现场,很多老手依旧用top,因为它是系统自带、任何发行版都有,没必要为了监控还装个工具。我的建议是:top的常用快捷键掌握好,htop作为补充体验就行,两者会一个就很够用了。

4. 系统服务管理:用systemctl掌控开机启动

新手对系统服务总觉得高深,觉得自己写的脚本怎么配开机自启、怎么用systemctl管理,一听就头大。其实这块一旦用起来,反而比前面大部分内容都简单,你把服务当成"一个能被系统统一管理、能开机自动启动、能被systemctl start/stop/status控制的后台进程"就明白了。

4.1 为什么需要systemd:从init脚本讲起

Linux传统上使用SysV init来管理系统启动流程,每个服务都靠一串脚本控制启停。老派做法的问题是启动脚本格式各异、串行启动速度慢、依赖关系混乱。后来各大发行版开始引入systemd,它做了三件大事:统一服务管理方式、并行加速启动过程、提供统一的日志和依赖管理。

你现在用的主流系统里,几乎都是systemd。判断方法很简单:

ps -p 1 -o comm=

如果输出是systemd,说明你的系统就是systemd管理。

systemd的设计中心思想是"unit"。系统的每一个可管理单元,不管是一个服务、一个挂载点、一个定时任务,在systemd眼里都是一个unit。unit有不同后缀,比如.service代表服务单元,.mount代表挂载单元,.timer代表定时器单元。日常管理最常操作的就是.service。

对比一下管理方式。以前启动Apache:

/etc/init.d/apache2 start

现在是:

systemctl start apache2

看起来差别不大,但systemd把统一的启动、停止、重启、查看状态、设置开机自启都收敛到了同一条命令上,不用记一堆分布在各目录的脚本。这就是它最大的价值:规范统一。

4.2 自己写一个systemd服务:把脚本变成服务

假设你写了一个数据采集脚本/data/collect.py,希望它在服务器启动后自动运行、挂掉能自动重启、还能用systemctl status查看状态。这就需要为它写一个unit文件。

创建一个service文件,路径是/etc/systemd/system/collect.service:

sudo vim /etc/systemd/system/collect.service

内容如下:

[Unit] Description=Data Collect Service After=network.target [Service] Type=simple ExecStart=/usr/bin/python3 /data/collect.py Restart=on-failure RestartSec=5 User=uspicapy Group=uspicapy [Install] WantedBy=multi-user.target

不用死记硬背,抓住几个关键字段就行:

[Unit]段的Description是服务描述,After=network.target表示等网络就绪后再启动这个服务。[Service]段是核心:ExecStart指定要执行的完整命令;Type=simple表示这条命令直接跑在前台,systemd认为进程只要起来了就算启动完成;Restart=on-failure表示进程异常退出时自动重启;RestartSec=5是重启前等5秒;User和Group指定以什么身份运行,避免用root跑业务脚本,这是安全实践。[Install]段的WantedBy=multi-user.target表示在进入多用户模式(也就是正常开机状态)时启动该服务。

写完文件后有两件事必须做:先重新加载unit文件,再启动服务:

systemctl daemon-reload systemctl start collect systemctl status collect

daemon-reload是最容易忘的一步。你改动或新增了unit文件,systemd不会自动感知,必须手动reload让新配置生效。每次改完service文件都执行一次,百试百灵。

如果确认脚本逻辑没问题,就设置开机自启:

systemctl enable collect

这条命令实际上是在/etc/systemd/system/multi-user.target.wants/目录下创建一个指向你unit文件的软链接,systemd在开机会自动根据这个目录决定要启动哪些服务。

4.3 systemctl命令实战速查表

给你整理一份高频命令表,平时用到的时候直接查:

操作命令
启动服务systemctl start 服务名
停止服务systemctl stop 服务名
重启服务systemctl restart 服务名
查看状态systemctl status 服务名
设置开机自启systemctl enable 服务名
取消开机自启systemctl disable 服务名
查看已启动的所有服务systemctl list-units --type=service --state=running
查看自启动失败的服务systemctl --failed

关于status的输出我多说一句:新手看systemctl status总觉得信息很多很乱,其实重点看左上角那段就行。它会有Active: active (running)或者Active: failed这样的标识,颜色和文字都很醒目。想退出status的界面按q就行,这命令本质也是分页查看。

如果某个服务启动失败,最常见的排查顺序是:先看status的输出尾部有没有报错原因,再用journalctl -u 服务名查看这个服务对应的日志。日志里通常直接写了失败原因,比如"配置文件找不到""端口被占用"等。

4.4 开机自启的秘密:enable背后发生了什么

很多人用systemctl enable用了很多次,但从没想过它到底做了什么,以至于遇到"设置了enable但服务没启动"时完全不知道从哪里排查。

前面提过,enable的本质是创建符号链接。你可以验证一下:

systemctl enable collect ls -l /etc/systemd/system/multi-user.target.wants/ | grep collect

输出里会有一个指向/etc/systemd/system/collect.service的软链接。理解了这一点,排查"为什么没开机自启"就很简单:先确认enable执行成功,再检查这个软链接是否存在。如果存在但没启动,大概率是unit文件里配置的启动条件没满足,比如After=指定的网络服务没起来、脚本路径写错了、或者脚本一启动就异常退出导致systemd反复重启失败。

再强调一个概念:enable和start是两个独立操作。enable只管开机是否启动,不会影响当前是否运行;start只管现在是否运行,不会改变开机配置。很多新手执行了systemctl enable xxx之后,发现服务当前没有运行,以为坏了,其实只是还缺一个systemctl start xxx而已。

把脚本做成服务的收益是长期的。以后不管是排查问题、看日志、还是自动化部署,都能直接用统一命令处理,不用再满系统找进程号。这是Linux进阶路上性价比很高的投入。

5. 常见问题与排查技巧实录

这个章节汇总一些我们前面分散提到的坑之外的、组合场景下才会暴露的典型问题。它们每一个都是真实环境里反复出现过的,我根据自己的排障经验整理出来,你可以直接当"速查速用"清单收藏。

5.1 忘记sudo密码或者root密码怎么办

这是最经典的新手地狱场景。解决办法取决于你的系统有没有进入单用户的途径。单用户模式相当于Windows里的安全模式,以root身份启动一个极简环境,不需要密码就能操作。

以常见的系统为例,在GRUB菜单选择内核那一行,按e进入编辑模式,找到以linux开头的那一行,在末尾加上single或者init=/bin/bash,按Ctrl+X或F10引导启动,就能进入单用户root shell。进去后执行passwd root重设root密码。重设完用reboot -f强制重启。

这里提醒三点:一是操作要快,GRUB菜单默认等待时间很短,屏幕亮起后马上按方向键选行进编辑界面;二是不同发行版编辑项写法略有差异,但核心思路就是往linux启动参数后追加single;三是这方法等于拥有系统最高恢复权限,所以生产服务器的启动控制台本身必须严格控制访问权限,这算安全基本功。

如果你的服务器有物理机访问权限,这招大概率能救回来。如果你用的是云主机,一般云控制台都会有"重置密码"或"VNC登录单用户模式"的入口,你先从那里进去重置密码,再回到系统里排查。

5.2 文件删不掉、显示Operation not permitted怎么办

你明明有目录写权限,文件属主也是自己,rm却提示不允许操作。遇到这个情况,先别急着怀疑权限,可以先执行lsattr 文件名看看属性位。

lsattr显示的是文件属性,和普通权限是两套体系。如果输出里有i或者a,问题就找到了:i表示immutable,文件不能修改、删除、重命名,连root都不能动,除非先去掉这个属性;a表示只能追加,不可覆盖删除。解决办法是用root执行:

chattr -i 文件名 rm 文件名

记住,处理完之后最好把chattr -i再恢复成原样,不要顺手把人家的保护属性永久关掉。

如果确实是因为权限问题删不掉,就回到权限章节排查:目录的写权限有没有给够、文件属主属组是不是你的,实在不行用root。不必一开始就上-9或者折腾chattr,先看基本的属主权限就好。

5.3 服务起不来、端口被占用的组合排障

假设你自己写的systemd服务启动失败,报错信息指向端口冲突。排障顺序推荐是:

第一步,查状态:

systemctl status myservice

第二步,查日志:

journalctl -u myservice -n 50

-n 50表示查看最近50行日志,日志里往往已经写了"Address already in use"之类的关键信息。

第三步,按端口反查占用进程:

ss -ltnp | grep 端口号

如果确认是端口被占用,决策就两个:要么停掉占用该端口的旧进程,要么修改本服务的监听端口。改端口记得同步修改应用自身的配置文件,改完执行systemctl daemon-reload再restart。

组合问题排查的思路永远是"分层定位":先确认服务本身状态,再看日志锁定错误类型,再根据错误类型检查端口、文件路径、权限哪个环节出问题。把这个思路练多了,大多数服务故障都能在你手里快速定位。

在我的实际使用体验里,用户、权限、进程、服务这几块知识不是孤立的,它们经常在同一个事故现场同时出现:用户没权限启动服务、服务起不来占用了端口、端口占用又多一个僵尸进程。所以这一篇把它们串在一起讲,就是希望你从一开始就建立一个整体认知。这篇的内容建议你开一台虚拟机,从建用户开始一步步过一遍,再照着共享目录和systemd服务的案例完整敲一遍。踩过几次坑之后你就明白了,所谓"实战能力"不过就是把这里面的每一件小事都亲手做过一遍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询