吃透 Linux 监控 + systemd:stress 压测、自定义服务全实操手册
监控系统负载
系统负载介绍
系统负载平均值:Linux内核以活动请求数的指数移动平均值来表示。
- 活动请求数不仅包含运行中进程,还包含等待IO的进程,对应于R和D。等待IO包括处于睡眠等待预期磁盘和网络响应的任务。
- 指数移动平均值是一个数学公式,可以平滑趋势数据的高值和低值,更加准确地表示一段时间内系统负载,并确定系统负载是随着时间增加还是减少。
- 根据所有CPU活动请求数,每5秒计算一次Load Average。通过汇总这些值,可以得到最近1分钟,5分钟和15分钟内的指数移动平均值。
- 一些UNIX系统仅考虑CPU使用率或运行队列长度。Linux中负载平均值中还包含了对IO的考量,遇到负载平均值很高但CPU活动很低时,检查磁盘和网络活动。
- Linux将各个物理CPU核心和微处理器超线程计为独立执行单元。每个独立的执行单元拥有独立的请求队列。
stress 工具
Linux 中的stress工具用于对系统进行压力测试,可模拟 CPU、内存、I/O 和磁盘等资源的高负载状态。通过指定参数(如-c压 CPU、-m压内存)可创建负载,帮助发现系统在压力下的稳定性问题,常用于性能调优或硬件验证。
# 安装[root@centos7 ~]# yum install -y stress# 帮助信息[root@centos7 ~14:15:51]# stress --help`stress' imposes certain types of compute stress on your system Usage: stress[OPTION[ARG]]... -?,--helpshow thishelpstatement--versionshow version statement -v,--verbosebe verbose -q,--quietbe quiet -n, --dry-run show what would have beendone-t,--timeoutNtimeoutafter N seconds--backoffNwaitfactor of N microseconds before work starts -c,--cpuN spawn N workers spinning on sqrt()-i,--ioN spawn N workers spinning on sync()-m,--vmN spawn N workers spinning on malloc()/free()--vm-bytes B malloc B bytes per vm worker(default is 256MB)--vm-stride Btoucha byte every B bytes(default is4096)--vm-hang NsleepN secs beforefree(default none,0is inf)--vm-keep redirty memory instead of freeing and reallocating -d,--hddN spawn N workers spinning on write()/unlink()--hdd-bytes BwriteB bytes per hdd worker(default is 1GB)Example: stress--cpu8--io4--vm2--vm-bytes 128M--timeout10s Note: Numbers may be suffixed with s,m,h,d,y(time)or B,K,M,G(size).压力测试-CPU
# 消耗2个CPU[root@centos7 ~14:17:19]# stress -c 2stress: info:[2595]dispatching hogs:2cpu,0io,0vm,0hdd ctrl+c 退出# top 监控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 KiB Mem:4026124total,1535676free,490668used,1999780buff/cache KiB Swap:4063228total,4063228free,0used.3277584avail Mem PIDUSERPR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2596root20073121000R100.00.01:01.42 stress2597root20073121000R100.00.01:01.25 stress2594root20016210023201588R0.60.10:00.12top......压力测试-内存
# 消耗前内存# 在一个终端查看[root@centos7 ~14:21:06]# free -mtotal usedfreeshared buff/cache available Mem:393147815001419523201Swap:396703967# 在新的终端中输入命令# 消耗 1G 内存[root@centos7 ~14:19:11]# stress -m 1 --vm-bytes 1Gstress: info:[2623]dispatching hogs:0cpu,0io,1vm,0hdd 按CTRL+c 退出# 在第一个终端下查看# 消耗后内存[root@centos7 ~14:21:44]# free -mtotal usedfreeshared buff/cache available Mem:393114035751419522274Swap:396703967压力测试-磁盘
# 消耗磁盘IO[root@centos7 ~]# stress -d 1 --hdd-bytes 2GCTRL+c# 监视活动状态百分比,%util[root@centos7 ~]# yum install -y sysstat iotop# 在另一个终端查看# 监控磁盘读写速度,重点关注rd_sec/s和wr_sec/s,单位是0.5k/每秒,每个sec(sector)是512Byte。[root@centos7 ~]# sar -dp 1......14时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.5014时23分30秒 sr00.000.000.000.000.000.000.000.0014时23分30秒 centos-root2698.000.002761728.001023.626.112.260.2979.5014时23分30秒 centos-swap0.000.000.000.000.000.000.000.0014时23分30秒 centos-home0.000.000.000.000.000.000.000.00......# 监控进程读写:左右方向键调整排序列,'>' 代表当前排序列[root@centos7 ~]# 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 WRITE>SWAPIN IO COMMAND4573be/4 laoma0.00B/s51.90M/s0.00%96.45% stress-d1--hdd-bytes 2G1be/4 root0.00B/s0.00B/s0.00%0.00% systemd --switched-root--system--deserialize222be/4 root0.00B/s0.00B/s0.00%0.00%[kthreadd]4be/0 root0.00B/s0.00B/s0.00%0.00%[kworker/0:0H]6be/4 root0.00B/s0.00B/s0.00%0.00%[ksoftirqd/0]7rt/4 root0.00B/s0.00B/s0.00%0.00%[migration/0]8be/4 root0.00B/s0.00B/s0.00%0.00%[rcu_bh]9be/4 root0.00B/s0.00B/s0.00%0.00%[rcu_sched]10be/0 root0.00B/s0.00B/s0.00%0.00%[lru-add-drain]11rt/4 root0.00B/s0.00B/s0.00%0.00%[watchdog/0]12rt/4 root0.00B/s0.00B/s0.00%0.00%[watchdog/1]13rt/4 root0.00B/s0.00B/s0.00%0.00%[migration/1]14be/4 root0.00B/s0.00B/s0.00%0.00%[ksoftirqd/1]...网络测试
# 传送一个大size的文件[root@centos7 ~14:27:17]# wget http://192.168.43.100/isos/CentOS-7-x86_64-DVD-2207-02.iso# 监控带宽[root@centos7 ~14:29:13]# sar -n DEV 1......14时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.0014时29分08秒 lo0.000.000.000.000.000.000.0014时29分08秒 virbr0-nic0.000.000.000.000.000.000.0014时29分08秒 virbr00.000.000.000.000.000.000.00......监控总结
以下是针对 Linux 系统监控的几条实用建议,涵盖关键监控维度和最佳实践:
- 核心指标实时监控
重点跟踪 CPU 使用率(用户态 / 系统态占比)、内存占用(含缓存 /swap 使用率)、磁盘 I/O(读写吞吐量、IOPS)和网络流量(带宽利用率、连接数)。可通过top/htop(实时)、vmstat/iostat(系统级)等工具快速查看。 - 部署专业监控工具
对于服务器集群或长期监控需求,建议使用 Prometheus + Grafana(可视化强)、Zabbix(全功能监控)或 Nagios(轻量告警)等工具,实现指标集中收集、趋势分析和历史数据查询。 - 设置关键阈值告警
针对核心指标配置告警阈值(如 CPU 持续 5 分钟超 80%、磁盘空间不足 10%),通过邮件、短信或即时通讯工具推送告警,避免故障扩大。注意避免告警风暴(可设置告警合并或延迟)。 - 监控进程与服务状态
定期检查关键服务(如 Nginx、MySQL)的运行状态、进程数及资源消耗,可通过systemctl status或自定义脚本实现。对异常退出的进程,结合日志排查崩溃原因。 - 日志集中管理与分析
将系统日志(/var/log/messages)、应用日志集中存储(如使用 ELK 栈),关注错误信息(ERROR级别)、登录异常(/var/log/auth.log)和磁盘错误(dmesg | grep error),必要时配置日志告警规则。 - 磁盘健康监控
除空间使用率外,需关注磁盘坏块(smartctl工具检测 S.M.A.R.T 信息)和文件系统完整性(定期运行fsck,非挂载状态下),避免硬件故障导致数据丢失。 - 网络与安全监控
监控端口开放状态(netstat/ss)、异常连接(尤其是外部 IP 的高频访问)和防火墙规则生效情况。可结合tcpdump抓包分析可疑流量。 - 定期性能基线分析
记录系统正常运行时的指标基线(如平均负载、内存使用峰值),当指标偏离基线时及时排查,避免微小异常累积成故障。 - 自动化监控脚本
对个性化需求(如特定目录文件数、应用响应时间),编写 Shell 或 Python 脚本定期执行检查,输出结果至监控系统或直接触发告警。 - 监控权限与安全
限制监控工具的权限(如仅授予读取日志和指标的权限),加密传输监控数据,防止监控系统本身成为安全薄弱点。
通过分层监控(基础指标→服务状态→业务性能)和主动预警,可显著提升系统稳定性和故障响应效率。
Linux 服务管理
systemd 介绍
基本概念
CentOS 7 使用 Systemd 引导系统启动,速度最快,所有进程无论有无依赖关系则都是并行启动(很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动)。Systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案。
服务:从业务角度来称呼,例如 web 服务,数据库服务。
守护进程(daemon):web 服务器对外提供 web 服务,由 web 相关的进程提供支持。
例如:
systemctl是一个在Linux系统中用于管理系统服务的命令。
# 安装软件包[root@centos7 ~]# yum install -y httpd# 启动服务[root@centos7 ~]# systemctl start httpd# 查看进程[root@centos7 ~]# ps axf|tail......18090? Ss0:00 /usr/sbin/httpd-DFOREGROUND18095? S0:00\_ /usr/sbin/httpd-DFOREGROUND18096? S0:00\_ /usr/sbin/httpd-DFOREGROUND18097? S0:00\_ /usr/sbin/httpd-DFOREGROUND18098? S0:00\_ /usr/sbin/httpd-DFOREGROUND18099? S0:00\_ /usr/sbin/httpd-DFOREGROUNDhttpd 服务对应的守护进程是18090、18095…
systemd 架构
unit 类型
systemctl 命令用于管理不同类型的系统对象,这些对象称之为units。
- Service unit:用于定义系统服务,文件扩展名为**.service**,例如httpd.service
- Socket unit:用于标识进程间通信用的 socket文件,文件扩展名为.socket
- Target unit:用于模拟实现“运行级别”,文件扩展名为.target
- Timer unit:用于管理计划任务,文件扩展名为.timer
- Device unit:用于定义内核识别的设备,文件扩展名为.device
- Mount unit:用于定义文件系统挂载点,文件扩展名为.mount
- Snapshot unit:管理系统快照,文件扩展名为.snapshot
- Swap unit:用于标识swap设备,文件扩展名为.swap
- Automount unit:文件系统的自动挂载点,文件扩展名为.automount
- Path unit:用于根据文件系统上特定对象的变化来启动其他服务,文件扩展名为.path
- Slice unit:用于资源管理,文件扩展名为.slice
systemctl的语法和常用选项
要使用systemctl命令,可以按照以下语法:
systemctl[选项][命令][服务名称]常用选项包括:
-h:显示帮助信息-t TYPE:指定服务类型,如service、socket、device等
查看 unit 列表信息
# 列出状态为loaded units[root@centos7 ~]# systemctl list-unitssystemctl list-units命令输出说明:
- UNIT:服务单元名称。
- LOAD:systemd是否正确解析了单元的配置并将该单元加载到内存中。
- ACTIVE:单元的高级别激活状态。此信息表明单元是否已成功启动。
- SUB:单元的低级别激活状态。此信息指示有关该单元的更多详细信息。信息视单元类型、 状态以及单元的执行方式而异。
- DESCRIPTION:单元的简短描述。
# -t选项查看特定类型unit 清单[jhl@centos7 ~]$ systemctl list-units-ttimer UNIT LOAD ACTIVE SUB DESCRIPTION systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories unbound-anchor.timer loaded active waiting daily update of the root trust anchorforDNSSEC LOAD=Reflects whether the unit definition was properly loaded. ACTIVE=The high-level unit activation state, i.e. generalization of SUB. SUB=The low-level unit activation state, values depend on unit type.2loadedunitslisted. Pass--allto see loaded but inactive units, too. To show all installed unit files use'systemctl list-unit-files'.# 列出类型为service,状态为active和inactive unit# 不加 -all 默认只会展示 active(活跃) 的服务单元# --all 全称--all-units 作用:展示所有类型状态的 service 服务,包含未启动、失效、被mask屏蔽、加载失败的全部服务,不再过滤隐藏。[root@centos7 ~]# systemctl list-units --type service --allUNIT LOAD ACTIVE SUB DESCRIPTION abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrt-vmcore.service loaded inactive dead Harvest vmcoresforABRT abrt-xorg.service loaded active running ABRT Xorg log watcher abrtd.service loaded active running ABRT Automated Bug Reporting accounts-daemon.service loaded active running Accounts Service ● apparmor.service not-found inactive dead apparmor.service# 列出所有unit,包括未loaded的unit[root@centos7 ~]# systemctl list-unit-files# 查看失败的服务[root@centos7 ~]# systemctl --failed --type service查看单个 unit 信息
# status 是 systemctl 的查询子命令,专门用于查看单个服务的完整运行状态[jhl@centos7 ~]$ systemctl status sshd.service ● sshd.service - OpenSSH server daemon Loaded: loaded(/usr/lib/systemd/system/sshd.service;enabled;vendor preset: enabled)Active:`active`(`running`)since 三2022-11-09 08:45:45 CST;5h 50min ago Docs: man:sshd(8)man:sshd_config(5)Main PID:1167(sshd)Tasks:1CGroup: /system.slice/sshd.service └─1167 /usr/sbin/sshd-D| 关键字 | 概述 |
|---|---|
| loaded | 单元配置文件已处理 |
| active(running) | 正在运行 |
| active(exited) | 已成功完成一次性配置 |
| active(waiting) | 运行中,正在等待事件 |
| inactive | 不再运行 |
| enabled | 系统引导时启动 |
| disabled | 系统引导时不启动 |
| static | 无法启动,依赖其他单元启动 |
控制系统服务
| 命令 | 任务 |
|---|---|
| systemctl statusUNIT | 查看单元状态的详细信息。 |
| systemctl stopUNIT | 在运行中的系统上停止一项服务。 |
| systemctl startUNIT | 在运行中的系统上启动一项服务。 |
| systemctl restartUNIT | 在运行中的系统上重新启动一项服务。 |
| systemctl reloadUNIT | 重新加载运行中服务的配置文件。 |
| systemctl maskUNIT | 禁用服务,使其无法手动启动或在系统引导时启动。 |
| systemctl unmaskUNIT | 使屏蔽的服务变为可用。 |
| systemctl enableUNIT | 将服务配置为在系统引导时启动。使用--now选项也会启动该服务。 |
| systemctl disableUNIT | 禁止服务在系统引导时启动。使用--now选项也会停止该服务。 |
# 停止服务[root@centos7 ~]# systemctl stop sshd.service# 客户端连接测试[root@centos7 ~]# ssh jianghuilin@10.1.8.10ssh: connect tohost10.1.8.10 port22: Connection refused# 启动服务[root@centos7 ~]# systemctl start sshd.service# 客户端连接测试[root@centos7 ~]# ssh jianghuilin@10.1.8.10# 重启服务,相当于stop再start[root@centos7 ~]# systemctl restart sshd.service# 一般用于配置文件变动后,重新加载[root@centos7 ~]# systemctl reload sshd.service# 重新加载服务,服务对应的主进程不会重启,只会重新加载一次配置文件。systemctl reload sshd(重载配置) 不会杀掉正在运行的 sshd 主 PID; 所有已经连上服务器的 SSH 会话保持在线,不会掉线; 只重新读取 /etc/ssh/sshd_config 新配置; 新的 SSH 连接才会生效新配置,老连接沿用旧参数;# 禁止服务开机自启[root@centos7 ~]# systemctl disable sshd.service[root@centos7 ~]# systemctl is-enabled sshddisabled# 重启系统验证[root@centos7 ~]# reboot# 重启完成后,直接用 Xshell 连接会报 Connection refused;# 操作流程:# 机房控制台 / 虚拟机本地登录服务器;# 执行 systemctl start sshd 启动 ssh 服务;# 回到 Xshell,手动双击会话重新连接。[root@centos7 ~]# systemctl status sshd# 显示 inactive (dead) 证明开机没有自动启动ssh服务# 再次确认开机自启配置[root@centos7 ~]# systemctl is-enabled sshd# 依旧输出 disabled# 启动 ssh 服务;[root@centos7 ~]# systemctl start sshd# 设置服务开机自启[root@centos7 ~]# systemctl enable sshd.service[root@centos7 ~]# systemctl is-enabled sshdenabled# 重启系统验证[root@centos7 ~]# reboot# 依然需要手动点击 Xshell 会话重新连接# 屏蔽禁用服务:服务被屏蔽禁用后,将无法start,因为服务的配置文件指向/dev/null[root@centos7 ~]# systemctl mask sshd.service[root@centos7 ~]# systemctl status sshd.servicesshd.service Loaded: masked(/dev/null;bad)Active: active(running)since 三2026-07-2218:58:25 CST;10min ago......# 尝试手动启动 sshd[root@centos7 ~19:08:54]# systemctl start sshdFailed to start sshd.service: Unit is masked.# 查看开机自启状态[root@centos7 ~19:10:13]# systemctl is-enabled sshdmasked# 取消禁用[root@centos7 ~]# systemctl unmask sshd.service[root@centos7 ~]# systemctl status sshd.servicesshd.service - OpenSSH server daemon Loaded: loaded(/usr/lib/systemd/system/sshd.service;enabled;vendor preset: enabled)Active: active(running)since 三2026-07-2218:58:25 CST;14min ago Docs: man:sshd(8)man:sshd_config(5)......[root@centos7 ~19:10:13]# systemctl is-enabled sshdenabledunit 配置文件
unit 配置文件存放在多个位置:
- /etc /systemd/system/unit.service,优先生效。一般是管理员自定义的配置。
- /usr/lib /systemd/system/unit.service,其次生效。系统软件包自带的默认配置。(sshd、httpd 在这里)
配置文件说明
示例单元文件/usr/lib/systemd/system/sshd.service说明
# 标识该部分为 Unit 配置,用于描述服务的基本信息、依赖关系等。 [Unit] # 服务的描述信息,说明这是 "OpenSSH 服务器守护进程",便于管理员识别服务用途。 Description=OpenSSH server daemon # 指定服务的文档路径,这里指向 sshd 命令的手册页(man 8 sshd)和配置文件的手册页(man 5 sshd_config),方便用户查阅帮助。 Documentation=man:sshd(8) man:sshd_config(5) # 定义服务的启动顺序:sshd 服务必须在 network.target(网络服务就绪)和 sshd-keygen.service(SSH 密钥生成服务)之后启动,确保依赖的资源已准备好。 After=network.target sshd-keygen.service # 表示 sshd 服务 "希望" sshd-keygen.service 运行(但不是强制依赖)。如果 sshd-keygen.service 启动失败,sshd 仍会尝试启动(通常用于生成初始 SSH 密钥,若密钥已存在则不影响)。 Wants=sshd-keygen.service # 标识该部分为 Service 配置,用于定义服务的启动方式、执行命令、重启策略等。 [Service] # 定义服务的类型为 notify:表示服务启动后会主动通知 systemd 自己已就绪(通过 sd_notify() 函数),systemd 会等待这个通知后再继续后续流程,确保服务真正可用。 Type=notify # 指定环境变量文件的路径,/etc/sysconfig/sshd 中通常定义 OPTIONS 等变量(如额外的 sshd 启动参数),这些变量会被后续的 ExecStart 引用。 EnvironmentFile=/etc/sysconfig/sshd # 服务启动时执行的命令: ExecStart=/usr/sbin/sshd -D $OPTIONS # /usr/sbin/sshd:sshd 守护进程的可执行文件路径。 # -D:表示 sshd 以非守护进程模式运行(前台运行),因为 systemd 通常管理前台进程,便于监控。 # $OPTIONS:引用 EnvironmentFile 中定义的额外参数(如 -p 2222 指定端口)。 # 服务重载配置时执行的命令: ExecReload=/bin/kill -HUP $MAINPID # kill -HUP 发送 SIGHUP 信号给 sshd 主进程,使其重新加载配置文件(无需重启服务)。 # $MAINPID 是 systemd 自动维护的服务主进程 ID。 # 定义服务停止时的杀死模式:process 表示只杀死服务的主进程(sshd 主进程),其子进程(如已建立的 SSH 连接)会被保留(避免强制中断现有连接)。 KillMode=process # 定义服务的重启策略:当服务因非正常退出(如崩溃、信号终止)时,systemd 会自动重启服务;正常退出(如主动停止)则不重启。 Restart=on-failure # 服务重启前的等待时间,这里设置为 42 秒,避免频繁重启导致资源耗尽。 RestartSec=42s # 标识该部分为 Install 配置,用于定义服务如何被 "启用"(即系统启动时自动运行)。 [Install] # 表示当系统启动到 multi-user.target(多用户命令行模式,非图形界面)时,该服务会被自动启动。这是服务器的默认运行级别,确保 SSH 服务在系统启动后可用。 WantedBy=multi-user.target开发一个 study 服务
开发 studyd 服务主程序 study
脚本说明:这是一个无限循环的脚本,每 5 秒会向
/var/log/study.log文件中追加一行包含当前时间的日志,内容为[时间]: I'M studying [ Linux ]。实验中提高效率的小技巧
(1)Vim 清空文件全部内容
进入普通模式:按 Esc
输入命令:ggdG
拆解讲解:gg 跳到文档第一行
d 删除
G 跳到文档最后一行
合起来:光标到首行,删除从首行到末行所有内容。
操作顺序:Esc → 直接敲 ggdG,回车都不需要!(2)Vim 内部复制粘贴(文件内复制一大段文字)
可视化选中复制
光标移动到要复制段落第一行
按下 V 大写 V (行可视化模式)
按上下方向键,选中需要复制的全部内容
按下 y (yank 复制)
移动光标到目标位置
按下 p 粘贴(粘贴到光标下方)
大写 P 粘贴到光标上方(3)将外面的内容复制到vim打开的文件中,要进入插入模式,否则内容会缺失
[root@centos7 ~16:15:19]# vim /usr/local/bin/study#!/bin/bash# 第一行内容是脚本的 "解释器声明"(shebang),指定该脚本使用 /bin/bash 作为解释器执行。系统会根据这一行找到对应的 shell 程序来解析后续命令。# 启动一个无限循环:while 是循环关键字,true 是一个永远为真的条件,因此这个循环会一直执行下去,直到被外部终止(如 Ctrl+C)。whiletrue# 循环体的开始标记,do 和后面的 done 之间的内容是循环中重复执行的命令。do# 执行 date 命令(获取当前系统时间),并通过 $(...) 捕获其输出,将结果赋值给变量 DATE。DATE=$(date)# echo 命令输出字符串,其中 $DATE 会被替换为变量的值# >> 是追加重定向符号,将输出内容追加到 /var/log/study.log 文件中# 最终输出内容类似 Fri Oct 31 10:00:00 CST 2025: I'M studying [ Linux ]。echo"$DATE: I'M studying [ Linux ]">>/var/log/study.log# 让脚本暂停执行 5 秒(sleep 命令用于延迟,单位默认为秒),避免循环执行过快。sleep5# 循环体的结束标记,与前面的 while 和 do 配合,标志着一次循环的结束。done# 给脚本添加可执行权限,如果不加,系统无法运行这个脚本[root@centos7 ~16:24:17]# chmod +x /usr/local/bin/study创建 studyd 服务单元文件
# 复制现成sshd服务模板,省去手动敲完整格式# sshd.service是系统自带标准服务配置,拿来做模板非常方便[root@centos7 ~16:25:51]# cp /usr/lib/systemd/system/sshd.service \/etc/systemd/system/studyd.service[root@centos7 ~16:26:32]# vim /etc/systemd/system/studyd.service[Unit] Description=study server daemon [Service] ExecStart=/usr/local/bin/study [Install] WantedBy=multi-user.target关键命令:刷新 systemd 配置(重中之重,新手极易遗忘)# systemd会把所有服务配置缓存到内存# 新建/修改.service文件后,必须执行daemon-reload刷新缓存# 不执行这条命令,systemd看不见新服务!# 通知 systemd 读取 unit 变化[root@centos7 ~16:26:36]# systemctl daemon-reload# 启用并启动服务 --now:额外立即启动服务[root@centos7 ~16:28:29]# systemctl enable studyd --now# 查看服务状态[root@centos7 ~16:28:34]# systemctl status studyd● studyd.service - study server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active:`active(running)`` since 五2026-7-2216:28:34 CST;1s ago 代表服务正常运行 Main PID:2786(study)Tasks:2CGroup: /system.slice/studyd.service ├─2786 /bin/bash /usr/local/bin/study └─2788sleep57月2216:28:34 centos7.laoma.cloud systemd[1]: Started study server daemon.# 重启服务,才能读取配置文件[root@centos7 ~15:21:40]# systemctl restart studyd.service补充:修改.service 配置文件之后,需要两条操作生效
systemctl daemon-reload→systemctl restart studyd.service验证日志
# tail -f:实时持续跟踪日志文件新增内容# 观察是否每隔5秒自动打印一行日志,证明服务正常循环运行[root@centos7 ~16:28:36]# tail -f /var/log/study.log2026年 07月22日 星期三22:44:59 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 22:45:04 CST: I'M studying[Linux]2026年 07月22日 星期三22:45:09 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 22:45:14 CST: I'M studying[Linux]2026年 07月22日 星期三22:45:19 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 22:45:24 CST: I'M studying[Linux]daemon-reload到底干什么?
简单类比:浏览器刷新页面。
systemd 启动时一次性读取所有 service 文件存入内存;后续新建、修改配置文件,内存里还是旧数据。执行daemon-reload重新扫描磁盘上所有服务配置,更新内存缓存。
❗注意:daemon-reload 不会重启任何服务,只是刷新配置清单。