Linux 服务管理:从 systemd 基础到自定义服务开发实战
2026/7/23 2:18:08 网站建设 项目流程

Linux 服务管理:从 systemd 基础到自定义服务开发实战

Linux 服务管理

windows 开机的时候,有些程序自动启动了。

命令行运行services.msc

systemd 介绍

基本概念

CentOS 7 使用 Systemd 引导系统启动,速度最快,所有进程无论有无依赖关系则都是并行启动(很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动)。Systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案。

系统引导程序:

  1. 用户空间,systemd,pid为1
  2. 内核空间,kthreadd,pid为2

服务:从业务角度来称呼,例如 web 服务,数据库服务。

守护进程(daemon):web 服务器对外提供 web 服务,由 web 相关的进程提供支持。

以web服务为例:

  • 服务:web服务
  • 守护进程:httpd

万和提供培训服务

  • 服务:万培训云计算
  • 守护进程:课程顾问、代课老师、就业老师等。

例如:

# 安装软件包[root@centos7 ~16:55:33]# yum install -y httpd# 启动服务[root@centos7 ~16:57:01]# systemctl start httpd# 查看进程[root@centos7 ~16:57:05]# ps -C httpd fPID TTY STAT TIME COMMAND2212? Ss0:00 /usr/sbin/httpd-DFOREGROUND2219? S0:00\_ /usr/sbin/httpd-DFOREGROUND2220? S0:00\_ /usr/sbin/httpd-DFOREGROUND2221? S0:00\_ /usr/sbin/httpd-DFOREGROUND2222? S0:00\_ /usr/sbin/httpd-DFOREGROUND2223? S0:00\_ /usr/sbin/httpd-DFOREGROUND

httpd 服务对应的守护进程是2212、2219…

systemd 架构

守护进程:systemd,由守护进程干活。

工具:systemctl,提供给用户要、用来根机器交互的工具。

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
查看 unit 列表信息
# 列出状态为loaded units[root@centos7 ~]# systemctl list-units

systemctl list-units命令输出说明:

  • UNIT:服务单元名称。
  • LOAD:systemd是否正确解析了单元的配置并将该单元加载到内存中。
  • ACTIVE:单元的高级别激活状态。此信息表明单元是否已成功启动。
  • SUB:单元的低级别激活状态。此信息指示有关该单元的更多详细信息。信息视单元类型、 状态以及单元的执行方式而异。
  • DESCRIPTION:单元的简短描述。
# -t选项查看特定类型unit 清单[myz@centos7 ~16:59:13]$ 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 anchorforLOAD=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[myz@centos7 ~]# systemctl list-units --type service --all# 列出系统中所有unit,包括未loaded的unit[myz@centos7 ~]# systemctl list-unit-files# 查看失败的服务[myz@centos7 ~]# systemctl --failed --type service
查看单个 unit 信息
[myz@centos7 ~17:00:35]$ 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 Wed2026-07-2216:51:24 CST;9min ago Docs: man:sshd(8)man:sshd_config(5)Main PID:1209(sshd)Tasks:1CGroup: /system.slice/sshd.service └─1209 /usr/sbin/sshd-DJul2216:51:24 centos7.myz.cloud systemd[1]: Starting OpenSSH server daemon... Jul2216:51:24 centos7.myz.cloud sshd[1209]: Server listening on0.0.0.0 port22. Jul2216:51:24 centos7.myz.cloud sshd[1209]: Server listening on :: port22. Jul2216:51:24 centos7.myz.cloud systemd[1]: Started OpenSSH server daemon. Jul2216:51:39 centos7.myz.cloud sshd[1902]: Accepted passwordformyz from7.1.8.1 po...h2 Hint: Some lines were ellipsized, use-lto showinfull.
关键字概述
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 myz@centos7 hostname# 启动服务[root@centos7 ~]# systemctl start sshd.service# 客户端连接测试[root@centos7 ~]# ssh laoma@centos7 hostname# 重启服务,相当于stop再start[root@centos7 ~]# systemctl restart sshd.service# 一般用于配置文件变动后,重新加载[root@centos7 ~]# systemctl reload sshd.service# 重新加载服务,服务对应的主进程不会重启,只会重新加载一次配置文件。# 禁止服务开机自启[root@centos7 ~]# systemctl disable sshd.service[root@centos7 ~]# systemctl is-enabled sshddisabled# 重启系统验证[root@centos7 ~]# reboot# 设置服务开机自启[root@centos7 ~]# systemctl enable sshd.service[root@centos7 ~]# systemctl is-enabled sshdenabled# 重启系统验证[root@centos7 ~]# reboot# 禁用服务:服务被禁用后,将无法start,因为服务的配置文件指向/dev/null[root@centos7 ~]# systemctl mask sshd.service# 取消禁用[root@centos7 ~]# systemctl unmask sshd.service
unit 配置文件

unit 配置文件存放在多个位置:

  • /etc /systemd/system/unit.service,优先生效。一般是管理员自定义的配置。
  • /usr/lib /systemd/system/unit.service,其次生效。软件包自带的默认配置。
配置文件说明

示例单元文件/usr/lib/systemd/system/sshd.service说明

# [Unit] 区域:定义服务基础信息、启动依赖与顺序 [Unit] # 服务描述,执行 systemctl status 时展示 Description=OpenSSH server daemon # 指定配套帮助文档,指向命令与配置文件手册页 Documentation=man:sshd(8) man:sshd_config(5) # 启动顺序:当前服务在网络、SSH密钥生成服务之后启动 After=network.target sshd-keygen.service # 弱依赖:尝试启动 sshd-keygen.service,其失败不影响本服务运行 Wants=sshd-keygen.service # [Service] 区域:定义服务运行参数、启停规则、进程管理 [Service] # 服务类型为 notify:程序就绪后主动通知 systemd,再继续后续流程 Type=notify # 加载环境变量文件,文件内参数可被启动命令引用 EnvironmentFile=/etc/sysconfig/sshd # 服务启动命令:-D 以前台模式运行,$OPTIONS 引用环境变量中的启动参数 ExecStart=/usr/sbin/sshd -D $OPTIONS # 重载配置命令:发送 SIGHUP 信号,让主进程重新加载配置 ExecReload=/bin/kill -HUP $MAINPID # 进程终止模式:仅杀死服务主进程,保留已建立的连接会话 KillMode=process # 重启策略:服务异常崩溃时自动重启,手动停止则不重启 Restart=on-failure # 服务重启延迟,避免短时间内频繁重启消耗资源 RestartSec=42s # [Install] 区域:定义开机自启规则,执行 enable 命令时生效 [Install] # 挂载至多用户运行环境,系统进入该模式时自动启动本服务 WantedBy=multi-user.target
开发一个 study 服务
  1. 开发 studyd 服务主程序 study

脚本说明:这是一个无限循环的脚本,每 5 秒会向/var/log/study.log文件中追加一行包含当前时间的日志,内容为[时间]: I'M studying [ Linux ]

[myz@centos7 ~17:00:53]$sudovim/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 22 7:00:00 CST 2026: I'M studying [ Linux ]。echo"$DATE: I'M studying [ Linux ]">>/var/log/study.log# 让脚本暂停执行 5 秒(sleep 命令用于延迟,单位默认为秒),避免循环执行过快。sleep5# 循环体的结束标记,与前面的 while 和 do 配合,标志着一次循环的结束。done[myz@centos7 ~17:09:51]$sudochmod+x /usr/local/bin/study
  1. 创建 studyd 服务单元文件
# 参考 sshd.service[myz@centos7 ~17:7:00]$sudocp/usr/lib/systemd/system/sshd.service\>/etc/systemd/system/studyd.service[myz@centos7 ~17:7:12]$sudovim/etc/systemd/system/studyd.service[Unit]Description=study server daemon[Service]ExecStart=/usr/local/bin/study[Install]WantedBy=multi-user.target# 通知 systemd 读取 unit 变化[myz@centos7 ~17:12:37]$sudosystemctl daemon-reload# 启用并启动服务[myz@centos7 ~17:13:23]$sudosystemctlenablestudyd--now# 查看服务状态[myz@centos7 ~17:13:33]$sudosystemctl status studyd ● studyd.service - study server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active: active(running)since Wed2026-07-2216:51:24 CST;23min ago Main PID:1211(study)CGroup: /system.slice/studyd.service ├─1211 /bin/bash /usr/local/bin/study └─2966sleep5Jul2217:13:50 centos7.myz.cloud studyd[1211]:[2026年 07月22日 星期三17:13:50 CST]s…ally Jul2217:13:55 centos7.myz.cloud studyd[1211]:[2026年 07月22日 星期三17:13:55 CST]s…ally
  1. 验证日志
[myz@centos7 ~17:28:20]# tail -f /var/log/study.log2026722日 星期三17:28:29 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:34 CST: I'M studying[Linux]2026722日 星期三17:28:39 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:44 CST: I'M studying[Linux]2026722日 星期三17:28:49 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:54 CST: I'M studying[Linux]......tudy.log2026722日 星期三17:28:29 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:34 CST: I'M studying[Linux]2026722日 星期三17:28:39 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:44 CST: I'M studying[Linux]2026722日 星期三17:28:49 CST: I'M studying [ Linux ] 2026年 7月 22日 星期三 17:28:54 CST: I'M studying[Linux]......

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

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

立即咨询