Linux---系统守护systemd(System Daemon)

article/2025/8/25 21:11:25
一、systemd 概述

1. 定位与作用

  • init 系统替代品:作为 Linux 系统的第 1 个进程(PID=1),替代传统的 SysVinit 和 Upstart,负责管理系统服务、启动流程、资源分配等。
  • 统一管理:通过 单元(Unit) 抽象各类系统资源,包括服务(service)、套接字(socket)、设备(device)、挂载点(mount)、目标(target)等。
  • 设计目标:高性能(并行启动)、高可用性、模块化、标准化配置。

2. 核心组件

  • systemd:主程序,作为 init 进程运行。
  • systemctl:核心命令行工具,用于管理单元(启动/停止/重启服务、查看状态等)。
  • systemd-analyze:分析系统启动时间、依赖关系等。
  • journalctl:查看系统日志(与 systemd-journald 日志系统集成)。
  • 其他工具:如 hostnamectl(主机名管理)、timedatectl(时间管理)等。

在这里插入图片描述

二、服务单元(.service)核心概念

服务单元 是 systemd 中最常用的单元类型,用于管理后台服务(如 sshdhttpd)。

三、服务单元文件结构

服务单元文件通常位于:

  • 系统服务/etc/systemd/system/(用户自定义)、/usr/lib/systemd/system/(官方默认)。
  • 用户服务~/.config/systemd/user/(仅当前用户可用)。

文件命名规则服务名.service(如 nginx.service)。

典型文件示例

[Unit]
Description=NGINX Web Server
Documentation=man:nginx(8)
After=network.target remote-fs.target nss-lookup.target
Wants=network-online.target[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
Restart=on-failure
RestartSec=5
User=nginx
Group=nginx
LimitNOFILE=65535[Install]
WantedBy=multi-user.target

WantedBy=multi-user.target:将此服务添加到 multi-user.target(多用户运行级别)的依赖列表中。当系统进入多用户模式时,会自动启动此服务。这相当于传统的 “开机自启” 设置。WantedBy 表示软依赖(通过符号链接实现),如果服务启动失败,不会影响目标的激活。

四、单元文件核心段(Section)
1. [Unit] 段:通用配置
  • Description:服务描述,供用户阅读。
  • Documentation:文档路径(支持 URL、man 手册等)。
  • 依赖关系
    • After=xxx.target:本服务在 xxx.target 之后启动(不检查依赖是否成功)。
    • Before=xxx.target:本服务在 xxx.target 之前启动。
    • Requires=xxx.service:强依赖,若依赖的服务启动失败,本服务也会失败(如 Requires=network.service)。
    • Wants=xxx.service:弱依赖,依赖的服务启动失败不影响本服务(如 Wants=network-online.target)。
    • BindsTo=xxx.service:与依赖服务生命周期绑定(同生共死)。
  • 冲突关系
    • Conflicts=xxx.service:禁止与指定服务同时运行(如 Conflicts=apache2.service)。
2. [Service] 段:服务核心配置
  • Type=:定义服务进程模型(关键配置):

    类型说明典型场景
    simple主进程为前台进程(默认值),systemd 认为服务启动成功当 ExecStart 运行后。大多数现代服务(如 Node.js)
    forking主进程启动后 fork 子进程,父进程退出(通过 PIDFile 指定子进程 PID)。传统 Unix 守护进程(如 Nginx)
    oneshot一次性任务(执行完 ExecStart 即退出),需配合 RemainAfterExit=yes 保持单元激活。数据备份、初始化脚本
    dbus需获取 D-Bus 名称后才算启动成功(通过 BusName= 指定名称)。依赖 D-Bus 的服务
    notify通过 sd_notify 接口通知 systemd 启动完成(需程序支持)。支持通知协议的服务
    idle所有非空闲任务完成后才启动服务。低优先级任务(如日志轮转)
  • 进程管理

    • ExecStart=:启动服务的命令或脚本(必填)。
    • ExecStartPre=:启动前执行的命令(可多次定义,按顺序执行)。
    • ExecStartPost=:启动后执行的命令。
    • ExecReload=:重新加载配置的命令(如 kill -HUP $PID)。
    • ExecStop=:停止服务的命令(默认 kill -TERM $MAINPID)。
    • ExecStopPost=:停止后执行的命令。
    • PIDFile=:指定 PID 文件路径(配合 Type=forking 使用)。
  • 重启策略

    • Restart=:控制服务崩溃后的重启行为,可选值:
      • no(默认):不重启。
      • on-success:仅在正常退出时重启(非错误退出不重启)。
      • on-failure:异常退出时重启(如退出码非 0、被信号终止)。
      • on-abnormal:因信号(非 SIGTERM/SIGKILL)或超时退出时重启。
      • on-watchdog:触发 watchdog 超时(需配置 WatchdogSec=)时重启。
      • always:无论何种原因退出,始终重启。
    • RestartSec=:重启前的等待时间(默认 10s)。
    • StartLimitInterval=:限制单位时间内的重启次数(防雪崩,如 StartLimitInterval=5s)。
  • 资源限制

    • CPUQuota=:限制 CPU 使用率(如 CPUQuota=50%,需内核支持 CGroups)。
    • MemoryLimit=:限制内存使用(如 MemoryLimit=1G)。
    • LimitNOFILE=:最大打开文件数(如 LimitNOFILE=10240)。
    • TasksMax=:限制进程数(如 TasksMax=500)。
  • 安全设置

    • User=/Group=:以指定用户/组运行服务(避免 root 权限)。
    • PrivateTmp=:为服务创建独立的临时目录(默认 yes,隔离文件系统)。
    • ProtectSystem=:限制对系统文件的访问(如 ProtectSystem=strict 禁止访问 /usr//etc)。
  • 环境变量

    • Environment=:直接设置环境变量(如 Environment="HTTP_PROXY=http://proxy.example.com")。
    • EnvironmentFile=:从文件读取环境变量(如 EnvironmentFile=/etc/sysconfig/nginx)。
3. [Install] 段:安装与激活配置
  • WantedBy=target:将服务添加到指定目标的依赖列表(最常用,相当于“开机自启”)。
    • 示例:WantedBy=multi-user.target(多用户模式启动)、WantedBy=graphical.target(图形界面模式启动)。
  • RequiredBy=target:强依赖,目标启动时必须启动本服务(慎用,避免循环依赖)。
  • Alias=:为服务创建别名(如 Alias=nginx-server.service)。
五、服务管理常用命令(systemctl)
操作命令示例说明
查看所有服务systemctl list-units --type=service --all包括活跃、非活跃、失败的服务
查看活跃服务systemctl list-units --type=service仅显示运行中的服务
启动服务systemctl start nginx.service立即启动服务
停止服务systemctl stop nginx.service立即停止服务
重启服务systemctl restart nginx.service先停止再启动
重新加载配置systemctl reload nginx.service不重启服务,仅重新加载配置
查看服务状态systemctl status nginx.service显示运行状态、日志等
启用开机自启systemctl enable nginx.service写入默认运行目标(如 multi-user.target
禁用开机自启systemctl disable nginx.service移除开机自启配置
查看服务依赖关系systemctl list-dependencies nginx.service显示直接/间接依赖
临时激活服务(重启后失效)systemctl start nginx.service --now仅本次启动有效
查看用户服务systemctl --user list-units --type=service管理当前用户的服务
六、高级特性与最佳实践
1. 服务依赖与启动顺序
  • 避免循环依赖:如 A.Requires=BB.Requires=A,systemd 会拒绝启动。
  • 按需启动(Socket 激活):通过 .socket 单元监听端口,仅当有请求时启动服务(如 sshd.socket 激活 sshd.service)。
    • 优势:减少资源占用,延迟启动服务。
2. 资源隔离与容器化
  • systemd-nspawn:轻量级容器工具,基于 systemd 实现进程隔离。
  • Scope 单元:动态创建的临时单元(如 systemd-run --scope --user my-script.sh),用于短期任务。
3. 日志管理(journalctl)
  • 服务日志默认由 systemd-journald 收集,可通过 journalctl 查看:
    journalctl -u nginx.service       # 查看指定服务日志  
    journalctl -u nginx --since today # 查看今日日志  
    journalctl -f -u nginx           # 实时跟踪日志  
    
  • 配置日志持久化:修改 /etc/systemd/journald.conf,设置 Storage=persistent 并重启 systemd-journald 服务。
4. 系统启动目标(Target)
  • 传统运行级别映射
    systemd 目标传统运行级别说明
    graphical.target5图形界面多用户模式
    multi-user.target3无图形界面多用户模式
    rescue.target1单用户救援模式
    emergency.target0紧急 Shell(无文件系统挂载)
    shutdown.target6关机
  • 切换目标
    systemctl isolate multi-user.target  # 切换至多用户模式  
    systemctl set-default graphical.target # 设置默认启动目标为图形界面  
    
5. 用户服务(User Services)
  • 用于管理当前用户的后台进程(如个人脚本、GUI 工具),优势:
    • 无需 root 权限,随用户登录自动启动。
    • 配置文件位于 ~/.config/systemd/user/
  • 示例:定义一个用户级别的定时备份服务:
    [Unit]
    Description=Daily Backup Service[Service]
    Type=oneshot
    ExecStart=/home/user/backup.sh[Install]
    WantedBy=default.target
    
    激活:systemctl --user enable --now daily-backup.service
七、故障排查与性能优化
  1. 启动时间分析
    systemd-analyze blame  # 按耗时排序启动项  
    systemd-analyze plot > boot.svg  # 生成启动时间可视化图表  
    
  2. 服务状态诊断
    • systemctl status service-name 查看运行状态,注意 Active: 字段(active(running) 表示正常,active(failed) 表示异常)。
    • 检查日志中是否有错误信息(journalctl -u service-name)。
  3. 依赖循环排查
    systemctl list-dependencies --reverse service-name  # 反向查看依赖链  
    
  4. 资源限制调优
    • 若服务频繁崩溃,尝试增加 MemoryLimit= 或调整 Restart= 策略。
    • 使用 systemd-cgtop 实时监控服务资源占用。
八、自定义服务示例
[Unit]
Description=ROS2 Vision Launch Service
After=network.target[Service]
Type=simple
User=kyleExecStartPre=/bin/sleep 5
ExecStart=/bin/bash -c 'cd /home/kyle/RM/Observation_of_whole_robot && source install/setup.bash && ros2 launch rm_vision_bringup vision_bringup.launch.py'Restart=always
RestartSec=5
# 防止服务重启过快导致资源耗尽
StartLimitInterval=60s
StartLimitBurst=3[Install]
WantedBy=multi-user.target

启用并启动服务

sudo systemctl daemon-reload   #重载 systemd 配置
sudo systemctl enable ros2_vision.service  #激活服务
sudo systemctl start ros2_vision.service

检查服务的状态

sudo systemctl status ros2_vision.service
九、注意事项与陷阱
  1. 避免直接修改官方服务文件
    • 官方服务文件位于 /usr/lib/systemd/system/,修改后可能被系统更新覆盖。
    • 正确做法:通过 systemctl edit service-name 创建覆盖文件(存于 /etc/systemd/system/service-name.d/)。
  2. Type 配置错误
    • Type=forking 但未指定 PIDFile=,systemd 会误认为服务启动失败。
  3. 环境变量作用域
    • EnvironmentFile= 引用的文件需注意权限(建议权限 644,避免敏感信息泄露)。
  4. 资源限制的内核支持
    • CGroups 相关配置(如 MemoryLimit=)需内核启用 CGroups v2,否则可能不生效。
十、延伸知识点(非服务单元,但需了解)
  • Socket 单元(.socket):监听端口或 Unix 套接字,触发对应服务启动(如 dbus.socket)。
  • Target 单元(.target):逻辑分组,用于组织多个服务(如 graphical.target 包含桌面环境相关服务)。
  • Timer 单元(.timer):定时任务,替代传统 cron(如 logrotate.timer)。
  • Mount 单元(.mount):管理文件系统挂载(如自动挂载 NFS 共享)。
总结:systemd 核心优势
  • 并行启动:通过依赖关系分析,并行启动无依赖的服务,大幅缩短启动时间。
  • 标准化配置:统一的单元文件格式,易于维护和迁移。
  • 强大的管理工具链systemctljournalctlsystemd-analyze 等工具覆盖全生命周期管理。
  • 资源精细化控制:通过 CGroups 实现 CPU、内存、进程数等资源的隔离与限制。

http://www.hkcw.cn/article/KWcQNgkHpY.shtml

相关文章

Lua语言学习

为什么要用Lua 大部分的手机系统出于安全考虑禁止从网络上下载代码后动态的将这些下载的代码加载到内存中执行 所以,当你更新游戏时,就必须让用户从手机市场下载更新版本的程序,游戏程序通常体积较大,重新下载不仅耗时还耗流量&…

Maven 仓库类型与镜像策略

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

蓝牙和wifi相关的杂项内容总结

蓝牙的传输速率演进 蓝牙技术的传输速率随着版本的演进不断提升,不同版本和模式(经典蓝牙 BR/EDR 和低功耗蓝牙 BLE)的速率差异显著。以下是蓝牙传输速率的完整发展历程和技术细节: 经典蓝牙(BR/EDR)的速…

AAA稳态LED太阳光模拟器的特点剖析

AAA稳态LED太阳光模拟器作为光伏测试领域的重要设备,其技术特点直接关系到太阳能电池研发与质量控制的精度。以下从光谱匹配性、辐照均匀性、稳定性、能效比及智能化设计五个维度展开深度剖析: 一、光谱匹配性的突破性进展 传统氙灯光源在AM1.5G标准光谱…

cadence PCB 精度设置成小数点4位方法

1. allegro 在进行PCB设计时,单位一般默认为Mils,会遇到,精度只能选择2位,不能增加到4位, 精度的范围只能设置为0-2,不能设置为3或4 2. Setup -> User preference,进行设置&#xff0c…

VirtualBox安装 Rocky

这不是 CentOS要完蛋了吗,找了Rock Linux 。下载了一个差不多需要10G,艹。 然后在virtual BOX中安装,安装成功了 安装和Centos一样: 《VirtualBox安装以及安装CentOS7》 有几点需要注意就行了: 准备工作 确保主机的…

【MySQL】C语言连接

要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载 我们使用C接口库来进行连接 要正确使用,我们需要做一些准备工作: 保证mysql服务有效在官网上下载合适自己平台的mysql connect库,以备后用 下载开发库 s…

SpringBoot 日志

今天我们来学习日志,日志是啥玩意呢,其实我们之前使用过超简易版的日志,就是打印,我感觉大家应该都一样,使用打印来检查代码是不是执行到这里了,通过控制台打印的日志来发现问题,排查问题&#…

C语言——深入理解指针(1)

一、内存和地址 1.1 内存 在讲内存之前,我们先看一个生活中的案例: 假设有一栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的一个朋友来找你玩,如果想找到你,就得挨…

计算机操作系统(十四)互斥锁,信号量机制与整型信号量

计算机操作系统(十四)互斥锁,信号量机制与整型信号量 前言一、进程互斥与互斥锁1. 什么是进程互斥?2. 互斥锁是什么? 二、信号量机制(解决互斥的更通用方案)1. 为什么需要信号量?2. …

铸铁平台的优势和应用

铸铁平台是一种具有广泛应用的工业设备,其在各个领域均发挥着重要作用。本文将探讨铸铁平台的优势和应用,以帮助读者更好地了解这一重要设备。 一、铸铁平台的优势 强度高:铸铁平台采用高强度铸铁材料制成,具有优异的强度和耐磨性…

EfficMultiCoreMemoryPool项目

目录 1. 定长内存池介绍 2. tcmalloc整体框架了解 2.1 ThreadCache设计 各区间内存浪费分析 2.1.1 ThreadCache申请内存 2.1.2 ThreadCache释放内存 2.1.3 TLS线程局部变量 2.2 CentralCache设计 2.2.1 CentralCache申请内存 ThreadCache --> CentralCache的申请内…

【Doris基础】Apache Doris vs 传统数据仓库:架构与性能的全面对比

目录 1 引言 1.1 传统数据仓库的发展 1.2 现代分析型数据库的崛起 2 核心架构对比 2.1 传统数据仓库的架构 2.2 Doris的架构设计 3 关键技术差异 3.1 存储引擎对比 3.2 查询执行对比 3.3 数据摄入方式对比 4 性能与扩展性对比 4.1 性能基准对比 4.2 扩展性对比 5…

字符串转换函数-leetCode-008

问题描述: 实现一个将字符串转换为整数的函数时,需要考虑各种边界情况和细节,例如空格的处理、符号的判断、数字的读取以及整数溢出的处理等。以下是详细的解题过程以及代码实现。 问题分析 空格处理:需要丢弃字符串开头的空格字…

深度学习目标检测实战——YOLOv8从入门到部署

本文将手把手带你用 YOLOv8(目前非常先进的目标检测框架)实现从数据标注到模型部署的全流程实战,并达到工业级检测精度! [yolo视频教程,戳蓝字即可学习] 这才是科研人该学的【YOLO算法全系列】,一口气学完…

C#对象集合去重的一种方式

前言 现在AI越来越强大了,有很多问题其实不需要在去各个网站上查了,直接问AI就好了,但是呢,AI给的代码可能能用,也可能需要调整,但是自己肯定是要会的,所以还是总结一下吧。 问题 如果有一个…

[ctfshow web入门] web124

信息收集 error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];// 长度不允许超过80个字符if (strlen($content) > 80) {die("太长了不会算");}/…

AI生成思维导图全技术解析

一、AI生成思维导图的底层技术逻辑 (一)知识结构化的核心流程 AI生成思维导图的本质是非结构化文本到结构化知识图谱的转化,其技术流程可拆解为五大核心环节: 1. 语义解析与实体抽取 多模态输入处理:支持文本(Markdown/Word/PDF)、语音(会议录音)、手写笔记(图片O…

秋招Day12 - 计算机网络 - 网络综合

从浏览器地址栏输入URL到显示网页的过程了解吗? 从在浏览器地址栏输入 URL 到显示网页的完整过程,并不是一个单一的数据包从头到尾、一次性地完成七层封装再七层解析的过程。 而是涉及到多次、针对不同目的、与不同服务器进行的、独立的网络通信交互&a…

SpringBoot集成第三方jar的完整指南

原文地址:https://blog.csdn.net/weixin_43826336/article/details/141640152?ops_request_misc%257B%2522request%255Fid%2522%253A%25227d4118ef2d572ba4428caf83f1d2bb28%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id7d4118…