Linux 命令行日课· 从零到得心应手的每日修行Day 01别再被命令行劝退了——Day 01终端、提示符与文本查看命令Day 02文件管理命令——创建、复制、移动、删除与链接Day 03求助、编辑与重定向——让 Linux 真正为你工作Day 04你的终端其实会编程——变量、环境与引号的艺术Day 05上Linux 的门禁系统——用户、组与密码管理Day 05下借力打力——su、sudo 提权与文件权限解密Day 06文件权限管理实战——从 chmod 到 chattr把权限锁明白Day 07进程管理与系统监控——ps、kill、jobs 到 top 全掌握Day 08系统服务管理与压力测试——从 systemd 到 stress把 Linux折腾明白本篇Day 09即将更新Day 07 我们学会了看进程、管进程、杀进程——但那都是事后操作进程已经跑起来了你再去盯、去管。今天要往前迈一步进程是怎么被系统生出来的谁在开机时帮我们把一堆服务拉起来你自己能不能写一个服务让 Linux 把它当亲儿子一样管这就是 systemd 的地盘。它是 CentOS 7 的 1 号进程整个系统里所有进程的老祖宗。今天你会亲手写一个自己的服务单元用systemctl启停它、设置开机自启、甚至 mask 掉它——就和管 sshd 一样。下半场再补一个监控进阶技能主动给系统施压。别等负载高了再去查——用stress工具模拟 CPU 飙升、内存吃紧、磁盘狂写用sar和iotop盯着指标变化。一来练手感二来以后上线前做压测你就知道怎么判断系统瓶颈在哪了。一、stress——主动给系统施压运维最怕的不是系统挂而是不知道它在什么条件下会挂。stress工具就是帮你找出这个边界的——它能模拟 CPU、内存、磁盘、网络的高负载状态让你在安全环境下观察系统的反应。1.1 安装与基本用法[rootcentos7 ~]# yum install -y stress[rootcentos7 ~]# stress --helpstress imposes certain types of compute stress on your system Usage: stress[OPTION[ARG]]... -c,--cpuN 启动 N 个进程做 sqrt()运算吃 CPU -m,--vmN 启动 N 个进程做 malloc()/free()吃内存 --vm-bytes B 每个内存进程分配多大默认 256MB -d,--hddN 启动 N 个进程做 write()/unlink()吃磁盘 IO --hdd-bytes B 每个磁盘进程写多少默认 1GB -i,--ioN 启动 N 个进程做 sync()刷磁盘缓冲 -t,--timeoutN 跑多久后自动停止所有参数后面的数字都可以带单位s/m/h/d/y时间或B/K/M/G大小。1.2 压 CPU——两行命令看负载起飞# 终端1启动 2 个吃 CPU 的进程[rootcentos7 ~]# stress -c 2stress: info:[2595]dispatching hogs:2cpu,0io,0vm,0hdd# 终端2top 盯住top-14:18:22 up47min,2users, load average:1.37,0.50,0.47Tasks:187total,4running,183sleeping,0stopped,0zombie %Cpu(s):100.0 us,0.0sy,0.0ni,0.0id,0.0wa,0.0hi,0.0si,0.0st PIDUSERPR NI VIRT RES SHR S %CPU %MEM TIME COMMAND2596root20073121000R100.00.01:01.42 stress2597root20073121000R100.00.01:01.25 stress两个 stress 进程各自吃满一个 CPU 核心%CPU各 100.0%Cpu(s)的us用户态飙升到 100.0id空闲归零。你的 2 核 CPU 被完全榨干了。加--timeout让 stress 到点自动退出stress -c 2 --timeout 60s——压 60 秒就停不用手动 CtrlC。1.3 压内存——看 free 的变化# 压测前[rootcentos7 ~]# free -mtotal usedfreeshared buff/cache available Mem:393147815001419523201Swap:396703967# 消耗 1G 内存[rootcentos7 ~]# stress -m 1 --vm-bytes 1Gstress: info:[2623]dispatching hogs:0cpu,0io,1vm,0hdd# 压测后另一个终端[rootcentos7 ~]# free -mtotal usedfreeshared buff/cache available Mem:393114035751419522274Swap:396703967used从770M 涨到 1709M差不多就是吃了 1G。Swap 还是 0——说明内存还没爆到要动交换分区。1.4 压磁盘——sar 和 iotop 盯 IO磁盘压力测试需要两个观测工具配合sar看整体磁盘吞吐iotop看是哪个进程在读写。# 安装观测工具[rootcentos7 ~]# yum install -y sysstat iotop# 终端1压磁盘——写 2G 数据[rootcentos7 ~]# stress -d 1 --hdd-bytes 2G# 终端2sar 监控磁盘速率每秒刷新[rootcentos7 ~]# sar -dp 114时23分29秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util14时23分30秒 sda2699.000.002762752.001023.626.112.260.2979.50重点看几个列wr_sec/s每秒写入扇区数。这里 2762752 个扇区 × 512 字节 约 1.35GB/秒——磁盘正在被疯狂写入。%util磁盘繁忙度。79.50% 意味着磁盘 80% 的时间在干活已经比较紧张了。如果接近 100%磁盘就是瓶颈。iotop 从另一个角度——看是谁在读写[rootcentos7 ~]# iotopTotal DISK READ:0.00B/s|Total DISK WRITE:51.90M/s Actual DISK READ:0.00B/s|Actual DISK WRITE:62.16M/s TID PRIOUSERDISK READ DISK WRITESWAPIN IO COMMAND4573be/4 zyf0.00B/s51.90M/s0.00%96.45% stress-d1--hdd-bytes 2Gstress进程占了 96.45% 的 IO 时间写入速度 51.90 M/s。左右方向键可以切换排序的列标记的就是当前排序依据。1.5 压网络——wget 大文件 sar 盯带宽不需要专门的网络压测工具——下载一个大文件就够了# 终端1下载一个 ISO 镜像几个 G[rootcentos7 ~]# wget http://192.168.50.200/course-materials/iso/CentOS-7-x86_64-DVD-2207-02.iso# 终端2盯网络接口流量[rootcentos7 ~]# sar -n DEV 114时29分07秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s14时29分08秒 ens3269961.005404.0096338.71513.950.000.000.00rxkB/s 37972.37 约37.08 MB/秒下载速度。ens33是你的物理网卡lo是回环接口基本不关心流量virbr0是虚拟网桥。二、systemd——Linux 的大管家stress 是造压力sar 和 iotop 是盯指标。但到目前为止你还不知道一个 Linux 系统是怎么启动的——开机那一刻谁来决定哪些程序跑起来、按什么顺序跑2.1 1 号进程所有进程的老祖宗[zyfcentos7 ~]$ps-p1PID TTY TIME CMD1? 00:00:02 systemdPID 为 1 的进程就是systemd。它是内核启动后第一个跑起来的用户态进程整个系统里除内核线程之外的所有进程都是它直接或间接 fork 出来的。CentOS 7 用 systemd 替代了老旧的 SysV init。它最大的改进是并行启动——不再像 SysV 那样一个服务等一个服务串行加载而是所有服务同时启动真有依赖关系的才排队。启动速度从泡杯茶变成了眨个眼。另一个 2 号进程kthreadd是内核空间的进程管理者管的是内核线程[kworker]、[ksoftirqd]这些带方括号的。2.2 服务 vs 守护进程——两个概念别混淆以 Web 服务为例服务service从业务角度说的——“我们要部署一个 Web 服务”。守护进程daemon从技术角度说的——实现这个服务的那几个后台进程。Web 服务的守护进程叫httpdSSH 服务的守护进程叫sshd。# 安装 httpdApache[rootcentos7 ~]# yum install -y httpd# 启动服务[rootcentos7 ~]# systemctl start httpd# 查看它的守护进程[rootcentos7 ~]# ps -C httpd fPID TTY STAT TIME COMMAND5271? Ss0:00 /usr/sbin/httpd-DFOREGROUND5288? S0:00\_ /usr/sbin/httpd-DFOREGROUND5289? S0:00\_ /usr/sbin/httpd-DFOREGROUND5290? S0:00\_ /usr/sbin/httpd-DFOREGROUND5291? S0:00\_ /usr/sbin/httpd-DFOREGROUND5292? S0:00\_ /usr/sbin/httpd-DFOREGROUNDsystemctl start httpd把 httpd 拉起来一个主进程 五个工作子进程——这叫守护进程组合在一起提供Web 服务。服务是上层概念守护进程是底层实现。2.3 systemd 的架构管家 遥控器systemd 由两部分组成守护进程systemd真正干活的——fork 进程、监控状态、收集日志。命令行工具systemctl给你用的遥控器——告诉 systemd 去启动/停止/重启某个服务。三、Unit——systemd 管理的对象systemd 不只是管服务。它把系统中所有需要管理的东西抽象成统一的单元Unit每种类型对应一个目的Unit 类型文件扩展名用途Service.service系统服务httpd、sshd——最常用Socket.socket进程间通信的 socket 文件Target.target模拟运行级别——一组服务的集合Timer.timer计划任务替代 cronDevice.device内核识别的设备Mount.mount文件系统挂载点Automount.automount自动挂载Swap.swapswap 设备Path.path监视路径变化触发其他服务日常打交道最多的是Service unit。下面所有操作都围绕它展开。3.1 列出所有 unit# 只列出已加载且活跃的 unit[rootcentos7 ~]# systemctl list-units# 只看 service 类型的——包括已停止的[rootcentos7 ~]# systemctl list-units --type service --all# 列出系统里所有已安装的 unit不管有没有加载[rootcentos7 ~]# systemctl list-unit-files# 只查 timer 类型的[zyfcentos7 ~]$ systemctl list-units-ttimer UNIT LOAD ACTIVE SUB DESCRIPTION systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directoriessystemctl list-units输出的四列含义列含义UNIT单元名称LOAD配置文件是否被正确加载到内存ACTIVE高层激活状态——active/inactive/failedSUB低层激活状态——running/exited/waiting等3.2 查看失败的服务[rootcentos7 ~]# systemctl --failed --type service出问题时先跑这一条——一眼看出哪个服务挂了。3.3 查看单个服务的详细状态[zyfServer ~18:41:10]$ systemctl status sshd ● sshd.service - OpenSSH server daemon Loaded: loaded(/usr/lib/systemd/system/sshd.service;enabled;vendor preset: enabled)Active: active(running)since 三2026-07-2216:48:34 CST;1h 53min ago Docs: man:sshd(8)man:sshd_config(5)Main PID:3019(sshd)Tasks:1CGroup: /system.slice/sshd.service └─3019 /usr/sbin/sshd-Dstatus输出里几个关键字段关键字含义loaded配置文件已加载active (running)正在运行active (exited)一次性任务已完成比如开机初始化脚本跑完就退出了active (waiting)正在等待某个事件触发inactive没有在运行enabled开机自动启动disabled开机不启动static不能独立启动只能被其他单元拉起来四、systemctl——管服务的遥控器下面的命令涵盖了日常运维中对服务的全部操作记住这个表就够了命令作用systemctl start UNIT启动服务systemctl stop UNIT停止服务systemctl restart UNIT重启 stop startPID 会变systemctl reload UNIT重新加载配置文件不重启进程PID 不变systemctl enable UNIT设为开机自启systemctl disable UNIT取消开机自启systemctl mask UNIT彻底禁用——连手动启动都不行systemctl unmask UNIT取消 masksystemctl is-enabled UNIT查是否开机自启4.1 start / stop / restart / reload用 sshd 来演示——因为它就是你现在 SSH 连上来的那根绳子操作它最直观# 停止 SSH 服务[rootcentos7 ~]# systemctl stop sshd.service# 此时客户端尝试连接——会失败[rootcentos7 ~]# ssh zyfcentos7 hostnamessh: connect tohostcentos7 port22: Connection refused# 启动回来[rootcentos7 ~]# systemctl start sshd.service[rootcentos7 ~]# ssh zyfcentos7 hostnamecentos7.zyf.cloud# 恢复了# 重启stop 再 startPID 会换[rootcentos7 ~]# systemctl restart sshd.service# reload改动配置文件后只重载配置不重启进程[rootcentos7 ~]# systemctl reload sshd.servicerestart vs reloadrestart是杀进程再起一个新的——服务会中断几秒。reload只是让主进程重新读一遍配置文件——服务不中断。改端口号必须 restart改访问控制规则 reload 就够了。4.2 enable / disable / is-enabled控制开机要不要自动启动——和现在跑不跑是两回事# 关闭开机自启[rootcentos7 ~]# systemctl disable sshd.service[rootcentos7 ~]# systemctl is-enabled sshddisabled# 重启系统验证——重启后 sshd 不会自动启动[rootcentos7 ~]# reboot# 重新打开开机自启[rootcentos7 ~]# systemctl enable sshd.service[rootcentos7 ~]# systemctl is-enabled sshdenabledenable --now可以一步到位既设为开机自启又立刻启动。disable --now反之——取消自启 立刻停止。4.3 mask——终极禁用disable只是不让开机启动你手动start还能拉起来。mask更狠——直接把服务的配置文件链接到/dev/null谁都别想启动它[rootcentos7 ~]# systemctl mask sshd.service[rootcentos7 ~]# systemctl start sshd.serviceFailed to start sshd.service: Unit is masked.# 直接拒绝# 取消 mask[rootcentos7 ~]# systemctl unmask sshd.service适用场景某个服务你永远不希望被任何人包括你自己手滑启动。五、读懂 unit 配置文件——以 sshd.service 为例所有 unit 配置文件存放在两个地方路径用途优先级/etc/systemd/system/管理员自定义的配置优先/usr/lib/systemd/system/软件包自带的默认配置其次想改一个服务的配置别直接改/usr/lib/下的原始文件——把它复制到/etc/systemd/system/再改你的版本会覆盖默认的。来看一下/usr/lib/systemd/system/sshd.service拆成三段读# [Unit] 区块描述信息 依赖关系 [Unit] DescriptionOpenSSH server daemon Documentationman:sshd(8) man:sshd_config(5) Afternetwork.target sshd-keygen.service Wantssshd-keygen.service # [Service] 区块怎么启动、怎么重载、怎么死 [Service] Typenotify EnvironmentFile/etc/sysconfig/sshd ExecStart/usr/sbin/sshd -D $OPTIONS ExecReload/bin/kill -HUP $MAINPID KillModeprocess Restarton-failure RestartSec42s # [Install] 区块在哪个运行级别下启动 [Install] WantedBymulti-user.target逐行解释——先说 [Unit] 区块Description给人看的描述。出了systemctl status顶上那行。Documentation给你指路的手册页——man sshd能看到的文档。Afternetwork.targetsshd 必须在网络就绪之后再启动——你网络都没通开了 SSH 也没人连得上。这只是声明顺序不是依赖。Wantssshd-keygen.service希望密钥生成服务跑着但万一它挂了也不影响 sshd 启动弱依赖和 Requires 强依赖不同。再说 [Service] 区块Typenotifysshd 启动完成后会主动通知 systemd我 OK 了。systemd 会在收到通知后才认为服务启动成功。EnvironmentFile从指定文件读取环境变量比如$OPTIONS这样不用把参数硬编码在 ExecStart 里。ExecStart启动服务的命令。-D让 sshd 前台运行systemd 管的就是前台进程。$OPTIONS来自上面的 EnvironmentFile。ExecReload重载配置时执行——发一个 SIGHUP 信号给主进程$MAINPID是 systemd 自动维护的变量sshd 收到后会重新读配置而不重启。KillModeprocess停止服务时只杀主进程不杀它的子进程已建立的 SSH 连接不会断。Restarton-failure异常退出时自动重启正常退出不重启。RestartSec42s重启前等 42 秒——防止崩溃后立即重启又崩溃无限循环吃资源。最后 [Install] 区块WantedBymulti-user.target当系统进入多用户命令行模式服务器默认的运行级别时自动启动本服务。这就是enable背后的机制——在这一层级创建符号链接。六、实战手写一个 study 服务光看也记不住。我们从头写一个自己的服务——把它当 sshd 一样管。6.1 写服务主程序一个简单的后台脚本每 5 秒往日志文件追加一行带时间戳的记录[rootcentos7 ~]# vim /usr/local/bin/study#!/bin/bashwhiletruedoDATE$(date)echo$DATE: IM studying [ Linux ]/var/log/study.logsleep5done# 加执行权限[rootcentos7 ~]# chmod x /usr/local/bin/study6.2 创建 unit 配置文件参考 sshd.service 来写自己的——不用从零开始[rootcentos7 ~]# cp /usr/lib/systemd/system/sshd.service \/etc/systemd/system/studyd.service[rootcentos7 ~]# vim /etc/systemd/system/studyd.service精简成只保留核心内容[Unit] Descriptionstudy server daemon [Service] ExecStart/usr/local/bin/study [Install] WantedBymulti-user.target放在/etc/systemd/system/下——这是管理员自定义的最高优先级路径。6.3 加载并启动# 通知 systemd 重新扫描配置文件[rootcentos7 ~]# systemctl daemon-reload# 启用并立即启动[rootcentos7 ~]# systemctl enable studyd --now# 查看状态[rootcentos7 ~]# systemctl status studyd● studyd.service - study server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active: active(running)since 五2025-10-3116:28:34 CST;1s ago Main PID:2786(study)Tasks:2CGroup: /system.slice/studyd.service ├─2786 /bin/bash /usr/local/bin/study └─2788sleep5Active: active (running)——你的服务在跑了systemd 把它当亲儿子一样管着。6.4 验证日志[rootcentos7 ~]# tail -f /var/log/study.log2025年10月31日 星期五16:28:29 CST: IM studying [ Linux ] 2025年 10月 31日 星期五 16:28:34 CST: IM studying[Linux]2025年10月31日 星期五16:28:39 CST: IM studying [ Linux ] 2025年 10月 31日 星期五 16:28:44 CST: IM studying[Linux]2025年10月31日 星期五16:28:49 CST: IM studying[Linux]......每 5 秒一条和脚本逻辑一致。你刚刚完成了写脚本 → 写 unit 文件 → daemon-reload → enable --now → status 验证——这就是一个 Linux 运维手上最常用的让程序变服务流程。七、监控总结——运维巡检十条学完 stress、sar、iotop加上 Day 07 的 top、uptime、ps你的工具箱已经很丰富了。下面十条建议不是死记硬背的清单而是一个日常巡检的思维框架核心指标实时监控CPU用户态/系统态占比、内存含 buffer/cache/swap、磁盘 IO吞吐量和 IOPS、网络带宽——四个维度一个不能少。top/htop看整体vmstat/iostat看系统级。部署专业监控工具单台机器用命令行集群用 Prometheus Grafana可视化强、Zabbix功能全或 Nagios轻量告警。长期趋势和历史数据命令行给不了你。设置阈值告警CPU 持续 5 分钟超 80%、磁盘不足 10%——设好阈值邮件/即时通讯推送。注意别搞成告警风暴——设置合并和延迟。监控进程与服务状态关键服务Nginx、MySQL定期查状态、进程数、资源消耗。systemctl status或自定义脚本。异常退出的进程配合日志追根因。日志集中管理系统日志/var/log/messages、应用日志集中收集ELK。关注 ERROR、登录异常/var/log/secure、磁盘错误dmesg | grep error。磁盘健康监控不止看空间——smartctl检测 S.M.A.R.T 信息硬件级预警定期fsck检查文件系统完整性。网络与安全监控ss/netstat看端口和连接tcpdump抓可疑流量关注异常的外部 IP 高频访问。建立性能基线系统正常运行时的平均负载、内存使用峰值——记下来。偏离基线就排查别等累积成大故障。自动化监控脚本个性化需求某目录文件数、应用响应时间自己写 Shell/Python 脚本输出到监控系统或触发告警。监控权限与安全监控工具只给读权限数据传输加密——别让监控系统本身变成攻击入口。今日骚操作# 一条命令创建自定义服务 压测 CPU 实时盯梢systemctl stop studyd2/dev/null;\cat/etc/systemd/system/studyd.serviceEOF [Unit] Descriptionstudy server daemon [Service] ExecStart/usr/local/bin/study [Install] WantedBymulti-user.target EOFsystemctl daemon-reload\systemctlenablestudyd--now\echo studyd 服务已启动 \systemctl status studyd --no-pager-l\echoecho 开始 CPU 压测30 秒 \stress-c2--timeout30sSTRESS_PID$!sar-u215\echoecho 当前负载 \uptime\echoecho study 日志尾巴 \tail-n5/var/log/study.log\wait$STRESS_PID2/dev/null\echo 压测结束 拆解先停掉旧的 studyd如果存在然后直接覆写 unit 配置文件daemon-reload→enable --now一气呵成——服务跑起来stress -c 2 --timeout 30s后台压两个 CPU30 秒自动停sar -u 2 15每 2 秒取一次 CPU 数据共 15 次刚好 30 秒uptimetail看压测期间负载和日志是否正常wait $STRESS_PID等压测结束再打印完成一条命令串起systemctl、systemd unit 文件编写、daemon-reload、stress、sar、uptime六项技能。下一篇预告Day 09 我们要进入 Linux 运维的安全保障——OpenSSH 服务管理。ssh远程登录、密钥认证、配置文件调优让你的服务器既方便管理又不会被暴力破解。今日练习写一个自己的服务脚本比如每分钟记录一次当前时间到日志创建 unit 文件用systemctl start/stop/enable/status完整操作一遍用stress -c 2 --timeout 60s压测同时在另一个终端用sar -u 1和uptime观察 CPU 和负载变化——感受负载从起飞到回落的全过程用stress -d 1 --hdd-bytes 1G压磁盘配合iotop找出是哪个进程在写、写了多少查看sshd.service的 unit 文件systemctl cat sshd.service试着标注出 [Unit]、[Service]、[Install] 三个区块的作用