RH124系列的第八篇总结我打算把systemd服务管理这部分好好拆开讲一讲。很多人在前面学文件、用户、权限时觉得还能应付一到进程和服务就开始懵明明命令敲了状态也显示active为什么一重启服务又不见了为什么restart和reload不一样为什么服务报错永远只说failed却没有下文其实不是你笨是这一阶段的学习目标变了——从“在系统里找东西”变成“让系统按你期望的方式持续运转”。这一篇我会围绕RH124课程里“控制服务和守护进程”这个核心主题把系统里最常用的systemctl操作、unit文件机制、target概念、常见故障排查套路一次性讲清楚。不管你是正在备考EX200还是工作中第一次接触Linux服务器只要把这篇的内容吃透后面再去学RH134里的存储、网络、SELinux都会顺很多。咱们直接开始。1. 到了RH124第八篇先想清楚这一阶段在学什么1.1 为什么说这是从“管文件”到“管系统”的转折点RH124是红帽系统管理一放在整个红帽认证体系里它承担的是“你刚进公司拿到一台Linux服务器至少能别把它弄崩”的职责。前面几篇总结里我们花了大量时间在命令行、文件系统、用户和组、权限控制上这些内容有一个共同特点它们都是在处理“静态对象”。文件就在那里用户就在那里你改了权限它就变了。但到了进程和服务这一块情况完全变了。你面对的是一个一直在运行、随时可能因为各种原因挂掉、还特别依赖环境配置的“动态系统”。上午还正常的web服务下午重启机器后死活起不来明明配置文件和手册一模一样防火墙也关了可端口就是不通。这些问题如果靠背命令去解决那你永远只能停留在“会敲systemctl restart”的层面而不知道背后到底发生了什么。所以RH124安排这个阶段真正的教育目标不是让你记住几十个systemctl子命令而是让你建立一种“运行时思维”一个服务启动需要哪些条件它依赖谁它的日志去哪看它和内核、网络、SELinux是什么关系。有了这套思维系统出问题的时候你才知道从哪里下手。1.2 进程、守护进程、systemd三个概念一次理清先说进程。进程就是正在运行的程序实例每个进程有个唯一的PID还有PPID父进程ID、用户归属、状态等一堆属性。你执行ps aux看到的每一行本质就是操作系统当前正在调度的一块“活体代码”。再说守护进程英文叫daemon。它和普通进程最大的区别是它不带终端常年跑在后台不需要你盯着。举一个生活化的例子普通进程像你去咖啡店点单后站在柜台等的那杯咖啡你和店员之间有对话、有交互守护进程则像咖啡店的中央空调从开门到打烊一直默默运转你几乎感觉不到它的存在但它坏了整个店就没法待客。sshd、httpd、chronyd这些典型的守护进程干的都是这个活儿。systemd是什么它是RHEL 7之后引入的1号进程也就是PID始终为1的那个“总管家”。所有其他进程要么是它直接拉起来的要么是它的子子孙孙。systemd最大的贡献是把以前零散的init脚本、运行级别、服务管理方式统一成了一套模型unit。服务、挂载点、设备、定时器在systemd眼里都是不同类型的unit。这样设计有个很直接的好处——所有东西都能用相似的方法查状态、做依赖、配自启。理解这三者的关系就好比理解了“员工、岗位、老板”的关系进程是员工daemon是长期在岗的员工systemd是那个给所有人排班、催活、记录考勤的老板。1.3 有了systemd以前的init为什么不行了很多教材在讲systemd时会提一句“替代了SysV init”。你要是不了解旧的init方式其实不影响使用但稍微知道一点背景能帮你理解systemd的设计初衷。在RHEL 6及更早的时代系统启动后由init进程按顺序执行一堆shell脚本脚本里写满start、stop、restart的case分支。这套东西的问题在于启动服务是串行的一个服务等一个服务慢脚本里做什么全靠人自觉没有统一的服务状态概念日志更是各写各的查起来痛苦。systemd改变的是什么呢它把“服务状态”这个概念标准化了。systemctl status看到的active、inactive、failed、activating这几种状态都是systemd主动跟踪的不是靠脚本echo出来的。它还支持并行启动只要两个服务之间没有依赖关系就同时拉起来启动速度比原来快一大截。再加上journald日志系统把内核日志和应用日志统一收拢排障的时候终于不用在不同目录里翻文件了。理解了这些后面所有systemctl命令就不再是“死记硬背”而是你对系统下指令的一种自然表达。接下来我们进入实操环节。2. systemctl服务管理命令不多但每个都别用错2.1 unit和unit文件服务在systemd里到底是怎样存在的systemd把系统中所有受管对象抽象成unit但考试和日常工作里你接触最多的还是.service。你可以把unit文件看成服务的“身份证工作手册”里面写清楚这个服务怎么启动、要不要依赖别人、启动失败后怎么处理。查看系统里都有哪些服务unit用这条命令systemctl list-units --typeservice --all加上--all能把没运行的服务也列出来不加则只显示当前load成功的。如果你只想看正在跑的systemctl list-units --typeservice想看某个服务的详细状态用systemctl status sshd它能输出服务当前加载的配置、主进程PID、占用内存、最近日志是排障第一站。想知道服务的“工作手册”长什么样可以systemctl cat sshd它会把unit文件内容和可能的override配置一起打印出来。unit文件的存放位置有讲究。系统出厂自带的放在/usr/lib/systemd/system/管理员自己加的或需要自定义覆盖的放在/etc/systemd/system/。前者的优先级低后者优先级高。原因是/usr目录在系统升级时可能被覆盖/etc是管理员专属领地你在这里面做的修改不会因为软件包更新而丢。RHEL系用的服务unit文件结构大致长这样[Unit] DescriptionOpenSSH server daemon Wantssshd-keygen.service Aftersshd-keygen.service [Service] Typenotify ExecStart/usr/sbin/sshd -D ExecReload/bin/kill -HUP $MAINPID [Install] WantedBymulti-user.target解读一下[Unit]区定义描述和依赖After表示要等哪个服务先起[Service]区定义怎么执行Typenotify是让systemd等服务自己通知“我准备好了”ExecStart是主进程命令ExecReload是重载方式[Install]区里的WantedBymulti-user.target决定这个服务在哪个target下被启用也是enable命令创建符号链接的依据。考试不一定让你写多复杂的unit文件但读得懂这一小段是加分项。2.2 start、stop、restart、reload启停服务时别把这些搞混先看最基础的四条systemctl start sshd systemctl stop sshd systemctl restart sshd systemctl reload sshdstart和stop好理解restart是“整个进程杀掉再重新拉起来”reload是“让运行中的进程重新读取配置”进程PID不变。这里最坑的就是restart和reload的选择。restart适合两种情况一是服务本来就没在运行你改了配置必须启动才能生效二是服务不支持热加载配置只能重启。reload适合的情况是服务正在对外提供服务你改了配置希望平滑生效比如修改sshd端口、修改nginx的server块用reload可以做到不中断现有连接这在生产环境非常宝贵。举一个我自己踩过的坑改sshd端口时图省事直接restart结果ssh连接瞬间断开幸好配置没错重新连一下就好。但如果你人在机房之外改完配置发现连不上了那真是叫天天不应。稳妥做法是改完配置先执行sshd -t验证语法再systemctl reload sshd最后新开一个终端测试。判断服务到底处于什么状态有几个快速命令systemctl is-active sshd systemctl is-enabled sshd systemctl is-failed sshdis-active看现在跑没跑is-enabled看开机自启有没有配is-failed看有没有“挂了但没被清理”的服务。这三个命令在脚本里做条件判断特别常用考试也可能让你写个脚本来检测服务状态。2.3 enable、disable、mask开机自启背后的符号链接逻辑新手最经典的疑问就是我明明start了服务重启机器后又没了为什么原因很简单——start只管“现在开”enable管“开机时开”两者是独立的。想让一个服务永远乖乖自启最佳实践是systemctl enable --now httpd--now的意思就是“开锁并立刻启动”相当于先enable再start一次搞定。enable背后到底干了什么它是在/etc/systemd/system/multi-user.target.wants/这种目录下创建了一个指向/usr/lib/systemd/system/httpd.service的符号链接。WantsBy目录名字里的multi-user.target正好对应unit文件里[Install]段的WantedBy。所以enable不是“把这个服务加入了某个神奇的列表”它就是在文件系统里加了个链接让systemd在进入multi-user.target时去拉起它。理解了这一点你就能解释为什么disable只是删链接而不是删unit文件。mask这个命令值得单独说。disable只禁止开机自启但你还是能用systemctl start xxx手动拉起mask更狠它会创建一个指向/dev/null的链接等于告诉systemd“这个unit不存在别理它”。就算你手动start它也会报“Unit is masked”直接拒绝。什么时候用mask比如你完全不想让某个服务在这个机器上被任何方式触发用mask最干净。解除mask用systemctl unmask。提醒一句对一个系统关键服务做mask之前想清楚启用时要看到Unit file路径确认没有指向/dev/null否则后面排查个大半天全是徒劳。2.4 target把服务打包成不同运行状态target允许你把一堆服务组织成一个整体需要哪个“模式”就切到哪个target。你可以把target通俗理解成“角色模板”或“家居模式”离家模式一键关灯关空调回家模式一键开灯开空调。Linux里的target就是系统级别的模式切换。RH124阶段必须认识的target有这些target名称作用对应传统级别poweroff.target关机0rescue.target单用户救援模式1multi-user.target多用户文本模式3graphical.target图形化多用户模式5reboot.target重启6查看当前默认targetsystemctl get-default临时切换targetsystemctl isolate multi-user.target比如你在图形界面用完想临时进文本界面isolate过去就行。把默认target永久改成多用户模式systemctl set-default multi-user.target为什么这个知识点在RH124里很重要因为考试经常会有“让系统启动后默认进入命令行模式不启动图形界面”这类需求答案就是改默认target。另外给服务设置开机自启时enable命令选择的WantedBy决定了这个服务在哪个target下被拉起。如果你手动编写unit文件并写了WantedBymulti-user.target启用后符号链接就会被创建到multi-user.target.wants目录下非常规整。target内部还有Wants、Requires、After几种依赖属性。Wants表示“建议启动但有失败也无妨”Requires是“必须启动否则本target失败”After只管顺序不管成不成立。这三个属性不需要背定义但遇到“为什么A服务跟着B一起启动了”这种问题去查一下unit文件的依赖关系基本就有答案。3. 服务起不来、卡住、开机失败三个高频故障排查实录3.1 完整排查套路status、journalctl、配置文件、端口、SELinux既然学了启停命令就得能应对“服务就是起不来”的局面。我的建议是把排查流程固定成一套固定动作不要东一榔头西一棒子。第一步看状态systemctl status vsftpd如果status只显示inactive(dead)或者failed但没告诉你原因接着执行第二步journalctl -u vsftpd -n 50-u指定服务-n 50看最近50行。启动失败的报错一般都会出现在这里。如果嫌时间范围不好定位还可以journalctl -u vsftpd --since 10 min ago第三步检查配置文件。像httpd、nginx、sshd、vsftpd都有自带的语法检查命令比如sshd -t、httpd -t、nginx -t。这一步能快速排除“配置文件多了个空格/少个分号”这类低级错误。第四步查端口。服务起不来有时是因为要监听的端口被别人占了ss -lntp | grep 21如果发现端口被占用可以用ss -lntp看到占用进程的PID和名字然后决定是停掉冲突服务还是改配置。第五步查SELinux。RHEL系统默认开着SELinux很多服务起不来不是配置错而是SELinux拦截了。先用getenforce看是Enforcing还是Permissive。如果在Enforcing下服务启动失败日志里会频繁出现avc denied字样这时用grep avc /var/log/audit/audit.log定位再用audit2why看一下原因。记住这个套路状态→日志→配置→端口→SELinux。五次里有四次能直接定位问题。3.2 进程真的死了systemd却还觉得服务在运行这个故障特别抓狂你用ps aux查不到服务进程端口也连不上但systemctl status显示active(running)。原因是服务的主进程异常退出残留的子进程没被systemd正确感知或者在用Typeforking时主进程退出后systemd没接收到预期信号。碰到这种情况第一反应不是reboot而是先看子进程pgrep -a vsftpd如果有残留进程先正常终止systemctl kill vsftpd这条命令会向服务的控制进程组发信号比手动kill干净。如果systemd已经把服务标记为failed但它又不让你正常restart先重置状态systemctl reset-failed vsftpd然后再start。整个流程是kill残留进程→reset-failed清状态→start重启。很多时候问题就出在systemd把服务标记为failed后你直接start它认为“已经有服务不能重复启动”于是报错。其实你只要reset-failed马上就能恢复正常。这也解释了一个考试时容易考的点systemctl restart并不能清掉failed状态必须先reset-failed再启动。很多RH124的机考模拟里会故意挖这个坑等你发现怎么restart都没用时想起reset-failed就通关了。3.3 开机自启“失效”的常见原因和验证方法开机自启失效常见原因就三个第一你只start了没有enable第二你enable了但服务的WantedBy和你当前的默认target对不上第三服务在系统启动早期就崩了systemd还没来得及拉起它。验证方法很简单先看enable状态systemctl is-enabled httpd如果显示enabled再看它挂在哪个target下ls -l /etc/systemd/system/multi-user.target.wants/ | grep httpd如果符号链接存在确认默认targetsystemctl get-default接下来看启动历史里它有没有报错journalctl -b -u httpd-b表示“本次开机以来的日志”。如果你在虚拟机里练习验证自启是否真的生效的最好办法就是重启一次systemctl reboot重启后直接访问服务端口或者systemctl status httpd比纸上谈兵可靠得多。还有一种自启失效场景是服务启动顺序问题。比如你的服务依赖数据库但在multi-user.target里A和B没有写After关系数据库还没就绪你的服务就先尝试连接连接失败自然起不来。解决办法不是把服务设置为Restartalways而是要理清依赖关系在unit文件的[Unit]段加上Aftermysqld.service和Requiresmysqld.service。4. 把配套命令一起拿下进程查看与资源监控4.1 ps、pstree、top从三个维度看进程RH124考服务管理不会只考systemctl进程查看命令同样是重点因为服务就是跑在进程里面的。ps aux是你最常打的命令它的输出包括用户、PID、CPU、内存、启动时间、命令行。想找某个特定进程配合grepps aux | grep httpdps -ef是另一种格式显示PPID更容易看父子关系比aux更清晰。ps -elf能额外看到优先级对判断进程调整有作用。pstree看进程家族树特别直观你一眼能看出systemd下面挂了哪些子进程一个命令起多个worker进程的父子关系也清清楚楚。刚学Linux的人用pstree辅助理解“PID 1是所有进程的老祖宗”这句话比单纯看文本输出要立体得多。top是动态视图能实时看CPU和内存占用还能看load average。它最实用的一点是进程需要人为干预时你可以先在top里找到占用最高的进程PID然后决定要不要处理。如果你觉得top的输出太密RHEL8/9也可以安装htop但考试里系统一般不带建议还是把top用熟。4.2 kill、pkill、killall终止进程时别乱用-9进程管理绕不开信号。kill命令本质是发信号不是“杀死”这么简单。默认是SIGTERM(15)请求进程自己退出给它时间保存状态、清理临时文件。SIGKILL(9)才是强制结束内核直接把进程资源回收进程没有机会做任何善后。备考和实际使用我强烈建议遵循这个原则先SIGTERM不行再SIGKILL。kill 12345 # 发SIGTERM kill -9 12345 # 强制结束如果你只知道进程名可以用pkillpkill -f java -jar app.jar-f表示匹配完整命令行尽量避免误杀。killall则按进程名精确匹配并终止例如killall nginx。注意killall并没有所谓“更高级”它只是把按名字匹配的便利性做出来了误杀风险同样存在。真正管理系统服务时能用systemctl停就别直接kill。systemctl stop会按unit文件里的配置发送合适的信号还会更新systemd内部状态比你自己kill干净。直接kill服务进程的后果是systemd可能以为服务还在运行或者服务虽然停了但状态变failed需要reset-failed才能恢复正常。考试既然如此设计咱们就用考试的方式去解决问题。4.3 uptime、free、df服务排障前先看系统底子很多初学者一上来就查服务日志最后发现服务本身没问题是系统资源被榨干了。所以我养成了一个习惯排障前先花十秒看三样东西。uptime看负载。三个数字分别代表1分钟、5分钟、15分钟的平均负载。如果1分钟负载远大于15分钟说明系统最近压力陡增如果三个数字都大于CPU核数系统大概率已经过载。free -h看内存。注意available这一列它才是“还可以分出去的容量”不是看free那一栏。buff/cache被回收后还能用available已经把这种回收能力算进去了。df -hT看磁盘。如果某个分区使用率接近100%服务写日志、写临时文件都会出问题。日志写不进去时服务经常表现为“启动成功但马上崩掉”非常迷惑。看完成绩再回到服务本身。比如发现系统负载很高就先top找是哪个进程在吃CPU然后ps看它的命令行定位是不是配置出错导致的死循环。这一套组合拳打下来服务排障的定位精度会高很多。5. RH124备考速查服务管理部分的命令表和练习清单5.1 一张速查表下面这张表是RH124服务管理章节最常用命令的浓缩版也是我自己备考时贴在终端上面的参考。不要求一次性全记住但每一条都要做到“看到命令能说出作用、看到问题能选出命令”。命令/场景作用备注systemctl status sshd查看服务详细状态排障第一选择systemctl is-active sshd只看当前是否运行适合脚本判断systemctl is-enabled sshd只看是否设置开机自启适合脚本判断systemctl enable --now httpd设置自启并立即启动比单独enable省事systemctl disable httpd取消开机自启不停止当前服务systemctl mask httpd完全封锁服务手动也无法启动systemctl unmask httpd解除封锁与mask成对使用systemctl isolate multi-user.target切换target临时切换运行级别systemctl set-default multi-user.target修改默认target开机生效systemctl reset-failed httpd清除failed状态restart前可用journalctl -u httpd -n 50查最近50行服务日志加-f可实时跟踪journalctl -b -u httpd查本次开机以来的日志排查开机自启问题ps aux | grep httpd查进程状态确认进程是否存活ss -lntp查监听端口端口冲突定位getenforce查SELinux模式服务起不来必查这张表里每个命令我都因为偷懒或疏忽付出过时间代价希望你看完后能少走弯路。5.2 自己搭一台虚拟机把服务“练坏再修好”我学RH124时最有效的练习方式不是反复默写命令而是故意把系统搞坏再一步步修好。这里给你一个可以直接照做的练习清单在虚拟机里安装RHEL或Rocky Linux装完先配好软件源然后用dnf install httpd装一个web服务。启动httpd并用curl localhost确认能访问然后执行systemctl restart httpd观察状态。故意把httpd配置文件改坏比如在/etc/httpd/conf/httpd.conf里写一行不存在的ServerName然后systemctl restart httpd观察status和journalctl的输出差异。修复配置恢复服务。这一步要练到不看文档也能根据报错定位问题。执行systemctl enable --now httpd重启虚拟机确认服务自动启动。执行systemctl mask httpd尝试start看系统怎么拒绝再unmask并验证恢复。新建一个简单的systemd unit文件放到/etc/systemd/system/设成开机自启重启验证。这套练习做完你对systemd的认知会从“会敲命令”变成“理解机制”。特别是第3步你能亲眼看到一个配置文件里的低级错误让一个服务彻底起不来以后再也不会手滑改错线上配置。做练习时记得给虚拟机配置一个快照或克隆练坏了随时回滚。别在物理机上练mask操作尤其别mask系统关键服务比如sshd或者systemd-journald否则你可能得跑机房。5.3 考试时容易忽略的细节RH124对应的EX200机考考试环境通常是一台运行中的虚拟机你要在命令行里完成各种系统管理任务。服务管理部分的考点很固定但有几个细节容易失分。第一看清题目要求是“enable”还是“enable --now”。题目说“设置httpd服务开机自启并立即启动”如果你只enable没start功能上服务可能没起来就扣分了。第二改完配置文件记得reload或restart不然服务还在用旧配置。题目要求“让配置生效”而你不能确定哪个命令更快时restart一般不会错但生产环境更推荐先语法检查再reload。第三设置默认target时题目可能写“开机不进入图形界面”答案要写systemctl set-default multi-user.target。注意别把set-default拼成isolateisolate只是当前生效重启后会变回去。第四创建unit文件后必须执行systemctl daemon-reload否则systemd不认识你新加的文件。这个命令在RH124里不一定会直接考但实际做服务管理时缺了它后面所有操作都会诡异失败。第五考试环境一般只有命令行没有图形界面任何操作都要靠命令行完成所以平时练习要尽量脱离图形界面别依赖virt-manager或GNOME的图形工具。我在实际学习中最大的体会是systemd这一章的知识点单独看每个命令都不难难的是把它们放到一个真实的故障场景里你能按顺序用出来。别急着刷题先多在虚拟机上做几次“故意搞坏再修好”的练习把状态、日志、配置、端口、SELinux这一条链路形成肌肉记忆。等到你处理一个httpd启动失败时不用想就能脱口而出“先看status再看journalctl”RH124的服务管理部分就真的过关了。
