Linux systemd 服务全面详解

news2025/4/10 21:37:38

在这里插入图片描述

一、systemd 是什么?

systemd 是 Linux 系统的现代初始化系统(init)和服务管理器,替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”,还统一管理服务、日志、设备挂载、定时任务等。


核心作用

  1. 服务管理:启动、停止、重启服务,设置开机自启。
  2. 并行启动:根据依赖关系并行启动服务,大幅缩短系统启动时间。
  3. 日志管理:通过 journalctl 集中管理所有服务的日志。
  4. 资源控制:限制服务的 CPU、内存等资源使用。
  5. 按需启动:通过套接字或总线激活服务,节省资源。

二、核心概念与配置

1. 单元(Unit)

systemd 通过单元文件(Unit File)管理系统资源,文件扩展名表示类型:

单元类型作用常见示例
.service管理后台服务(如 Nginx、MySQL)nginx.service
.socket管理套接字(按需启动服务)docker.socket
.timer定时任务(替代 crondaily-backup.timer
.target逻辑分组(类似运行级别)multi-user.target
.mount文件系统挂载home.mount

2. 服务文件(.service)详解

服务文件通常位于 /usr/lib/systemd/system/(系统默认)或 /etc/systemd/system/(自定义覆盖)。
一个典型服务文件分为三个部分:

示例:Python Web 应用服务
[Unit]
Description=My Web Application
After=network.target  # 确保网络就绪后启动

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/myapp  # 指定工作目录(避免路径错误)
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure
Environment="APP_ENV=production"  # 设置环境变量(如配置生产模式)

[Install]
WantedBy=multi-user.target  # 关联到多用户命令行模式
关键参数解析
  • [Unit] 部分

    • Description:服务描述(用于日志和状态显示)。
    • After/Before:定义启动顺序(如 After=network.target)。
    • Requires:强依赖服务(依赖失败则当前服务失败)。
    • Wants:弱依赖服务(依赖失败不影响当前服务)。
  • [Service] 部分

    • Type:服务类型(见下文详解)。
    • ExecStart:启动命令(必须用绝对路径)。
    • Restart:重启策略(noon-failurealways)。
    • User/Group:以指定用户/组运行(提升安全性)。
    • Environment:设置环境变量(如数据库密码)。
  • [Install] 部分

    • WantedBy:定义服务所属的目标(target),控制开机启动场景。

3. 服务类型(Type)详解

类型行为适用场景
simple主进程启动即视为服务已就绪(默认类型)。简单脚本或后台程序。
forking主进程 fork 子进程后退出,systemd 通过 PIDFile 跟踪子进程。传统守护进程(如 Nginx)。
oneshot执行一次性任务后退出,需配合 RemainAfterExit=yes 维持状态。初始化脚本或备份任务。
notify服务通过 sd_notify 发送就绪信号后,systemd 才认为服务启动完成。需要明确初始化完成的服务。
为什么需要 forking 类型?
  • 历史兼容性:传统守护进程(如 Nginx)会自行 fork 子进程并退出父进程。
  • 脱离终端:子进程脱离终端控制,避免被 Ctrl+C 或终端关闭信号终止。
  • 资源消耗:父进程短暂存在后退出,实际资源由子进程占用,与 simple 类型无显著差异。

4. 目标(Target)

target 是 systemd 的逻辑分组单位,定义系统的不同运行状态(类似传统运行级别):

Target 名称作用
multi-user.target多用户命令行模式(无图形界面)。
graphical.target图形界面模式。
rescue.target单用户救援模式(用于系统修复)。
timers.target定时任务关联的目标。

关联服务
[Install] 部分设置 WantedBy=multi-user.target,表示系统进入该目标时服务自动启动。


三、常用命令速查

1. 服务管理

# 启动/停止/重启服务
systemctl start <服务名>
systemctl stop <服务名>
systemctl restart <服务名>

# 查看服务状态
systemctl status <服务名>

# 启用/禁用开机自启
systemctl enable <服务名>
systemctl disable <服务名>

# 重新加载修改后的服务文件
systemctl daemon-reload

2. 日志管理

# 查看服务日志
journalctl -u <服务名>

# 实时追踪日志
journalctl -fu <服务名>

# 按时间筛选日志
journalctl --since "09:00" --until "10:00"

3. 系统状态

# 列出所有运行中的服务
systemctl list-units --type=service

# 分析系统启动时间
systemd-analyze

四、典型案例与场景

1. 部署 Python Web 应用

需求:将脚本 /opt/myapp/app.py 设为后台服务,开机自启。
步骤

  1. 创建服务文件 /etc/systemd/system/myapp.service
    [Unit]
    Description=My Python Web App
    After=network.target
    
    [Service]
    User=www-data
    Group=www-data
    WorkingDirectory=/opt/myapp  # 确保脚本能读取同目录下的文件
    ExecStart=/usr/bin/python3 /opt/myapp/app.py
    Restart=always
    Environment="APP_ENV=production"  # 传递环境变量
    
    [Install]
    WantedBy=multi-user.target
    
  2. 启用并启动服务:
    systemctl daemon-reload
    systemctl enable myapp
    systemctl start myapp
    

2. 定时备份文件(替代 cron)

需求:每天凌晨 3 点执行备份脚本 /opt/scripts/backup.sh
步骤

  1. 创建服务文件 /etc/systemd/system/backup.service
    [Unit]
    Description=Daily File Backup
    
    [Service]
    Type=oneshot
    ExecStart=/bin/bash /opt/scripts/backup.sh
    
  2. 创建定时器文件 /etc/systemd/system/backup.timer
    [Unit]
    Description=Run backup daily at 3 AM
    
    [Timer]
    OnCalendar=*-*-* 03:00:00  # 每日 3 点执行
    Persistent=true            # 如果错过时间,开机后补执行
    
    [Install]
    WantedBy=timers.target
    
  3. 启用定时器:
    systemctl enable backup.timer
    systemctl start backup.timer
    

关联逻辑

  • .timer.service 文件必须同名(或通过 Unit= 显式指定)。
  • 定时器触发时,systemd 执行对应的服务。

3. 限制服务资源

需求:限制服务最多使用 512MB 内存和 50% CPU。
服务文件配置

[Service]
...
MemoryMax=512M  # 最大内存限制
CPUQuota=50%    # CPU 时间配额

五、常见问题排查

1. 服务启动失败

  • 查看日志journalctl -u <服务名>
  • 检查路径和权限:确保 ExecStart 的命令路径正确,且 User 有权限访问相关文件。
  • 手动测试命令:直接运行 ExecStart 的命令验证是否报错。

2. 服务无法开机自启

  • 确认服务已启用:运行 systemctl is-enabled <服务名>
  • 检查 [Install] 配置:确保 WantedBy 指向正确的 target(如 multi-user.target)。

3. 环境变量未生效

  • 显式设置变量:在服务文件中使用 Environment="KEY=value"
  • 避免 Shell 变量:systemd 不读取用户 Shell 的环境变量。

六、高级功能

1. 按需启动(Socket Activation)

通过 .socket 单元监听端口,当有请求时启动服务:

# /etc/systemd/system/myservice.socket
[Socket]
ListenStream=8080  # 监听 TCP 端口 8080

[Install]
WantedBy=sockets.target

2. 服务依赖与顺序

[Unit]
Requires=postgresql.service  # 强依赖
After=postgresql.service     # 确保 PostgreSQL 先启动

七、总结

systemd 的核心优势

  1. 统一管理:服务、日志、定时任务等通过单一工具管理。
  2. 高效并行:依赖驱动的启动机制大幅优化启动速度。
  3. 灵活配置:通过单元文件实现细粒度控制。

学习建议

  • 从简单服务文件入手,逐步实践定时任务和资源限制。
  • 善用 journalctlsystemctl status 排查问题。
  • 参考官方文档:systemd.io

附:速查表

# 查看服务依赖关系
systemctl list-dependencies <服务名>

# 杀死服务进程
systemctl kill <服务名>

# 查看所有定时器
systemctl list-timers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2329064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SortedSet结构之用户积分实时榜单实战

Redis 中的SortedSet结构非常适合用于实现实时榜单的场景&#xff0c;它根据成员的分数自动进行排序&#xff0c;支持高效的添加、更新和查询操作。 SortedSet实时榜单的一些典型应用场景&#xff1a; 游戏中的玩家排行榜&#xff1a;在多人在线游戏中&#xff0c;使用 Sorte…

C++_类和对象(中)

【本节目标】 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什…

学习笔记—C++—入门基础()

目录 C介绍 参考文档 C第一个程序 命名空间namespace namespace的价值 namespace的定义 namespace使用 指定命名空间访问 using将命名空间中某个成员展开 展开命名空间中全部成员 输入和输出 缺省参数 函数重载 引用 引用的概念 应用 const引用 指针和引用的关…

大数据Spark(五十七):Spark运行架构与MapReduce区别

文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点&#xff0c;负责管理Worker节点。Worker:Spark集群中资源管理的从节点&#xff0c;负责任务的运行…

道路裂缝数据集CrackForest-156-labelme

来源于开源的数据集 https://github.com/cuilimeng/CrackForest-dataset 进行整理修改而成。 文章目录 1. 介绍2. 应用场景3. 相关工具4. 下载地址 1. 介绍 在现代城市管理中&#xff0c;道路状况的监测与维护是确保交通安全和城市基础设施健康的重要环节。 CrackForest是一个…

Redis数据结构之Hash

目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表&#xff0c;而且value是一个键值对集合&#xff0c;类似Map<String, Map<…

故障矩阵像素照片效果ps标题文本特效滤镜样机 Glitched Arcade Text Logo Effect

有时&#xff0c;视觉效果比文字本身更能讲述故事&#xff0c;因此请确保您已竭尽全力提供令人敬畏的展示。品牌标识或演示元素&#xff0c;该资产可以处理您的项目所涉及的任何内容。由于智能对象图层&#xff0c;此文本效果将为获得理想的结果铺平道路。这些允许您在指定的图…

[创业之路-352]:从创业和公司经营的角度看:分析美国的三大财务报表

一、美国政府的财务报表 如果把美国政府看成一个公司&#xff0c;从三大财务报表上看&#xff0c;美国政府资产雄厚&#xff0c;但利润表年年亏损&#xff0c;现金流量表年年为负&#xff0c;现金流持续吃紧&#xff0c;面临现金流断裂导致公司倒闭的风险。 马斯克在降低公司各…

【教学类-102-02】自制剪纸图案(留白边、沿线剪)02——Python+PS自动化添加虚线边框

背景需求: 01版本实现了对透明背景png图案边界线的扩展,黑线实线描边 【教学类-102-01】自制剪纸图案(留白边、沿线剪)01-CSDN博客文章浏览阅读974次,点赞15次,收藏7次。【教学类-102-01】自制剪纸图案(留白边、沿线剪)01https://blog.csdn.net/reasonsummer/article…

OFP--2018

文章目录 AbstractIntroductionRelated Work2D object detection3D object detection from LiDAR3D object detection from imagesIntegral images 3D Object Detection ArchitectureFeature extractionOrthographic feature transformFast average pooling with integral imag…

CentOS-查询实时报错日志-查询前1天业务报错gz压缩日志

最新版本更新 https://code.jiangjiesheng.cn/article/364?fromcsdn 推荐 《高并发 & 微服务 & 性能调优实战案例100讲 源码下载》 1. 查询实时报错日志 物理路径&#xff08;带*的放在靠后&#xff0c;或者不用*&#xff09; cd /home/logs/java-gz-log-dir &am…

ETF 场内基金是什么?佣金最低又是多少呢?

嘿&#xff0c;朋友们&#xff0c;大家好啊&#xff0c;我是StockMasterX&#xff0c;今天咱们就坐下来慢慢聊聊这个话题&#xff0c;ETF 场内基金到底是个啥东西&#xff0c;它的佣金最低能到多少&#xff0c;真的是个值得深挖的问题。 说起ETF&#xff0c;我还记得刚入行那会…

[论文阅读]PMC-LLaMA: Towards Building Open-source Language Models for Medicine

PMC-LLaMA&#xff1a;构建医学开源语言模型 摘要 最近&#xff0c;大语言模型在自然语言理解方面展现了非凡的能力。尽管在日常交流和问答场景下表现很好&#xff0c;但是由于缺乏特定领域的知识&#xff0c;这些模型在需要精确度的领域经常表现不佳&#xff0c;例如医学应用…

26考研——线性表(2)

408答疑 文章目录 一、线性表的定义和基本操作二、线性表的顺序表示三、 线性表的链式表示四、 顺序表和链表的比较五、参考资料鲍鱼科技课件26王道考研书 六、总结顺序表总结顺序表特点深入掌握顺序表的管理方式 单链表总结双循环链表总结 一、线性表的定义和基本操作 文章链…

低代码开发平台:飞帆画 echarts 柱状图

https://fvi.cn/711 柱状图这个控件是由折线图的控件改过来的&#xff0c;在配置中&#xff0c;单选框选择柱状图就行了。

PowerPhotos:拯救你的Mac照片库,告别苹果原生应用的局限

如果你用Mac管理照片&#xff0c;大概率被苹果原生「照片」应用折磨过——无法真正并行操作多个图库。每次切换图库都要关闭重启&#xff0c;想合并照片得手动导出导入&#xff0c;重复文件更是无处可逃…… 直到我发现了 PowerPhotos&#xff0c;这款专为Mac设计的照片库管理…

Linux 下 日志系统搭建全攻略

目录 一、引言 二、日志系统基础 日志级别 日志输出格式 三、创建日志所需函数 认识可变参数 ​编辑 获取时间的函数 小结 四、创建日志 一、引言 在 Linux 环境中开发 C/C 程序时&#xff0c;日志系统是不可或缺的一部分。它不仅有助于调试程序、排查问题&#xff…

Linux系统安装Postgre和Postgis教程

卸载 如果之前没装过可以忽略这一步 卸载前记得备份数据库数据(如果还需要的话)&#xff01;&#xff01;&#xff01; 一、删除 Docker 安装的 PostgreSQL/PostGIS 1. 停止并删除容器 # 查看所有容器 docker ps -a | grep postgres# 停止并删除容器&#xff08;替换为实际…

LXC 导入多Linux系统

前提要求 ubuntu下安装lxd 参考Rockylinux下安装lxd 参考LXC 源替换参考LXC 容器端口发布参考LXC webui 管理<

6547网:蓝桥STEMA考试 Scratch 试卷(2025年3月)

『STEMA考试是蓝桥青少教育理念的一部分&#xff0c;旨在培养学生的知识广度和独立思考能力。考试内容主要考察学生的未来STEM素养、计算思维能力和创意编程实践能力。』 一、选择题 第一题 运行下列哪个程序后&#xff0c;飞机会向左移动&#xff1f; ( ) A. …