当前位置: 首页 > news >正文

程序崩了没人盯!学会 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

例如:

# 安装软件包[xiaoma@centos7 ~10:46:51]$sudoyuminstall-yhttpd# 启动服务[xiaoma@centos7 ~11:15:26]$sudosystemctl start httpd# 查看进程[xiaoma@centos7 ~11:16:05]$ps-Chttpd f PID TTY STAT TIME COMMAND5154? Ss0:00 /usr/sbin/httpd-DFOREGROUND5156? S0:00\_ /usr/sbin/httpd-DFOREGROUND5157? S0:00\_ /usr/sbin/httpd-DFOREGROUND5158? S0:00\_ /usr/sbin/httpd-DFOREGROUND5159? S0:00\_ /usr/sbin/httpd-DFOREGROUND5160? S0:00\_ /usr/sbin/httpd-DFOREGROUND

httpd 服务对应的守护进程是18090、18095…

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 ~11:31:11]# systemctl list-units

systemctl list-units命令输出说明:

  • UNIT:服务单元名称。
  • LOAD:systemd是否正确解析了单元的配置并将该单元加载到内存中。
  • ACTIVE:单元的高级别激活状态。此信息表明单元是否已成功启动。
  • SUB:单元的低级别激活状态。此信息指示有关该单元的更多详细信息。信息视单元类型、 状态以及单元的执行方式而异。
  • DESCRIPTION:单元的简短描述。
# -t选项查看特定类型unit 清单[xiaoma@centos7 ~11:32:12]$ 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 anchorforD 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[root@centos7 ~11:31:37]# systemctl list-units --type service --all# 列出系统中所有unit,包括未loaded的unit[root@centos7 ~11:33:15]# systemctl list-unit-files# 查看失败的服务[root@centos7 ~11:34:11]# systemctl --failed --type service

查看单个 unit 信息

[xiaoma@centos7 ~12:57:01]$ 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 三2026-07-2212:55:52 CST;37min ago Docs: man:sshd(8)man:sshd_config(5)Main PID:1207(sshd)Tasks:1CGroup: /system.slice/sshd.service └─1207 /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 ~14:24:22]# systemctl stop sshd.service# 客户端连接测试[root@centos7 ~14:24:47]# systemctl xiaoma@centos7 hostname# 启动服务[root@centos7 ~14:25:23]# systemctl start sshd.service# 客户端连接测试[root@centos7 ~14:26:17]# ssh xiaoma@centos7 hostname# 重启服务,相当于stop再start[root@centos7 ~14:27:28]# systemctl restart sshd.service# 一般用于配置文件变动后,重新加载[root@centos7 ~14:28:16]# systemctl reload sshd.service# 重新加载服务,服务对应的主进程不会重启,只会重新加载一次配置文件。# 禁止服务开机自启[root@centos7 ~14:29:03]# systemctl disable sshd.service[root@centos7 ~14:29:46]# systemctl is-enabled sshddisabled# 重启系统验证[root@centos7 ~14:30:15]# reboot# 设置服务开机自启[root@centos7 ~14:31:02]# systemctl enable sshd.service[root@centos7 ~14:31:30]# systemctl is-enabled sshdenabled# 重启系统验证[root@centos7 ~14:32:16]# reboot# 禁用服务:服务被禁用后,将无法start,因为服务的配置文件指向/dev/null[root@centos7 ~14:33:16]# systemctl mask sshd.service# 取消禁用[root@centos7 ~14:33:45]# 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] # 服务的描述信息,说明这是 "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 服务

  1. 开发 studyd 服务主程序 study

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

[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
  1. 创建 studyd 服务单元文件
# 参考 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 读取 unit 变化[root@centos7 ~15:02:23]# systemctl daemon-reload# 启用并启动服务[root@centos7 ~15:02:34]# systemctl enable studyd --now# 查看服务状态[root@centos7 ~15:03:09]# systemctl status studyd● studyd.service - OpenSSH server daemon Loaded: loaded(/etc/systemd/system/studyd.service;enabled;vendor preset: disabled)Active: active(running)since 三2026-07-2215:03:09 CST;19s ago Main PID:4130(study)Tasks:2CGroup: /system.slice/studyd.service ├─4130 /bin/bash /usr/local/bin/study └─4150sleep572215:03:09 centos7.xiaoma.cloud systemd[1]: Started OpenSSH server daemon.
  1. 验证日志
[root@centos7 ~15:35:25]# tail -f /var/log/study.log2026年 07月22日 星期三15:34:46 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:34:51 CST: I'M studying[Linux]2026年 07月22日 星期三15:34:56 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:35:01 CST: I'M studying[Linux]2026年 07月22日 星期三15:35:06 CST: I'M studying [ Linux ] 2026年 07月 22日 星期三 15:35:11 CST: I'M studying[Linux]......
http://www.jsqmd.com/news/1245693/

相关文章:

  • UE4物体操控核心:空间转换、旋转处理与性能优化实战
  • Cocos Creator集成WebRTC:原生插件方案实现跨平台实时音视频通话
  • Claude Code系统提示词优化:80%削减实战与AI编程效率提升
  • 企业品牌升级说明:主体更名完成,技术服务体系完整延续
  • 直流照明降损节能,智慧路灯点亮智慧城市脉络
  • ClaudeCode与llamacpp本地部署大语言模型实战指南
  • RabbitMQ核心架构与分布式系统解耦实战
  • 基于SDL2的现代C++媒体引擎:从RAII封装到跨平台架构设计
  • 2026年7月最新卡地亚青岛万象城维修保养服务电话 - 卡地亚官方售后中心
  • C++分布式系统实战:从单机到集群的架构演进与brpc应用
  • 现代C++并发编程实战:std::thread、std::async与std::chrono高效应用指南
  • MFC桌面应用现代化:WebView2、本地服务器与浏览器控件三大集成方案深度对比
  • C/C++头文件配置化实践:编译期配置与构建系统集成
  • VC++ DirectShow视频采集实战:从Filter Graph构建到Halcon机器视觉集成
  • VRRP MSTP
  • 基于Gemma 4 12B构建视频推理可视化系统的完整指南
  • 深入剖析C++ std::deque:数据结构、源码实现与性能优化
  • 个人编程学习暨正解当代人人工智能功能性问题
  • 2026年7月目前诚信的塑钢带直销厂家怎么选择,打包机/塑钢带/彩色缠绕膜/PE机用缠绕膜/透明胶带,塑钢带公司选哪家 - 品牌推荐师
  • CDN技术解析:提升网站性能与用户体验
  • C++二维数组与矩阵运算:从内存布局到高性能优化实战
  • 房地产宣传片制作全解析:从传统宣传到数字化营销革新
  • 开源合成数据技术在金融AI中的低成本实践
  • ChatGPT记忆功能:提升开发者对话效率的AI记忆技术解析
  • WebGL与WebGPU实战:43个案例从基础渲染到高级优化
  • 为什么团队接入 Hermes 后联调反而慢了?先看懂上下文切分逻辑
  • 智能广告竞价模型Bid2X:跨场景统一建模与零样本迁移
  • 不用 @CircuitBreaker 注解,自定义 Resilience4j 熔断器 + AOP 实现
  • ChatGPT Work早期测试:工作场景AI助手部署与API集成指南
  • 推荐一下广东服务不错的无缝焊接窗门窗源头工厂:优选 - 品牌推广大师