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

Linux systemd 服务全面详解

在这里插入图片描述

一、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

相关文章:

Linux systemd 服务全面详解

一、systemd 是什么&#xff1f; systemd 是 Linux 系统的现代初始化系统&#xff08;init&#xff09;和服务管理器&#xff0c;替代传统的 SysVinit 和 Upstart。它不仅是系统启动的“总指挥”&#xff0c;还统一管理服务、日志、设备挂载、定时任务等。 核心作用 服务管理…...

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

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

C++_类和对象(中)

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

#SVA语法滴水穿石# (007)关于 $past 的用法

今天,我们要学习比较重要的一个关键字。$past 的用法,今天系统学习。 1. $past 函数的核心作用 $past 用于 获取某个信号在过去指定时钟周期前的值,通常用于检查历史状态是否符合预期。 其语法如下: $past(signal, [num_cycles], [gating_condition], [clock], [reset])…...

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

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

kotlin函数类型

一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 &#xff1a; (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型&#xff1b; (String) -> Unit 表示接收 Strin…...

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

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

虚拟Ashx页面,在WEB.CONFIG中不添加handlers如何运行

https://localhost:44311/webapi.ashx 虚拟ASHX页面,在WEB.CONFIG中添加handlers&#xff0c;如何不添加节点&#xff0c;直接运行?把页面直接保存ASHX名称&#xff1f;现在是.VB 如果你不想通过在 web.config 里添加 handlers 节点来配置处理程序&#xff0c;而是直接让 .as…...

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

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

HTML 表单:构建交互式网页的关键元素

HTML 表单:构建交互式网页的关键元素 引言 HTML表单是构建交互式网页的核心组件之一,它允许用户与网站进行交互,提交信息、填写问卷或进行其他操作。本文将深入探讨HTML表单的基础知识、常用元素、表单验证以及如何优化表单设计,以提高用户体验和网站的可访问性。 HTML表…...

Java进阶-day06:反射、注解与动态代理深度解析

目录 一、反射机制&#xff1a;Java的自我认知能力 1.1 认识反射 1.2 获取Class对象 1.3 获取类的成分 二、注解&#xff1a;Java的元数据机制 2.1 注解概述 2.2 元注解 2.3 注解解析 2.4 注解的实际应用 三、动态代理&#xff1a;灵活的间接访问机制 3.1 为什么需要…...

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;面临现金流断裂导致公司倒闭的风险。 马斯克在降低公司各…...

【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)

源码 use super::constant::BILINEAR_INTERPOLATION_BITS; // Inspired by Filter_32_opaque from Skia. fn bilinear_interpolation(tl: u32,tr: u32,bl: u32,br: u32,mut distx: u32,mut disty: u32, ) -> u32 {let distxy;let distxiy;let distixy;let distixiy;let mut…...

vs环境中编译osg以及osgQt

1、下载 OpenSceneGraph 获取源代码 您可以通过以下方式获取 OSG 源代码: 官网下载:https://github.com/openscenegraph/OpenSceneGraph/releases 使用 git 克隆: git clone https://github.com/openscenegraph/OpenSceneGraph.git 2、下载必要的第三方依赖库 依赖库 ht…...

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

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

基于 Netty 框架的 Java TCP 服务器端实现,用于启动一个 TCP 服务器来处理客户端的连接和数据传输

代码&#xff1a; package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; imp…...

fbx bip互转 测试OK

目录 fbx bip互转 3dmax插件fbx转bip: 测试可以转: MotionBuilder fbx转bip fbx bip互转 3dmax插件fbx转bip: 测试可以转: 不用插件!!无脑把Mxiamo转bip骨骼动画 - CG软件插件脚本交流 - Powered by Discuz!...

iptables只允许指定网段的ip访问某端口配置

yum install -y iptables-services #安装 systemctl restart iptables.service #重启防火墙使配置生效 systemctl enable iptables.service #设置防火墙开机启动 systemctl disable iptables.service #禁止防火墙开机启动 iptables -F 清除所有链的规则。 关闭所有访问端口 …...

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…...

libevent DNS开发

一、DNS功能 Libevent的DNS功能提供异步解析与服务器搭建能力,其核心设计分为‌阻塞式解析‌与‌事件驱动异步解析‌两套机制。 阻塞式解析(同步)‌ ‌功能定位‌ 通过evutil_getaddrinfo()提供可移植的阻塞式域名解析,兼容无标准getaddrinfo()接口的系统(如旧版…...

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王道考研书 六、总结顺序表总结顺序表特点深入掌握顺序表的管理方式 单链表总结双循环链表总结 一、线性表的定义和基本操作 文章链…...

写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码?

VB.NET 写.NET可以指定运行SUB MAIN吗?调用任意一个里面的类时,如何先执行某段初始化代码? 分享 1. 在 VB.NET 中指定运行 Sub Main 在 VB.NET 里&#xff0c;你能够指定 Sub Main 作为程序的入口点。下面为你介绍两种实现方式&#xff1a; 方式一&#xff1a;在项目属性…...

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

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

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

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

如何在Springboot的Mapper中轻松添加新的SQL语句呀?

在如今的软件开发界&#xff0c;Spring Boot可是非常受欢迎的框架哦&#xff0c;尤其是在微服务和RESTful API的构建上&#xff0c;真的是让人爱不释手&#xff01;今天&#xff0c;我们就来聊聊如何为Spring Boot项目中的Mapper添加新的SQL语句吧&#xff01;说起来&#xff0…...