老E的博客

  • 首页
  • 关于
  • 技术应用
    • VPS相关
    • AI相关
    • 盒子相关
    • 其他
  • 订阅Youtube频道
  • 网络加速
    • expressvpnNo.1 ExpressVPN
    • 最佳免费VPN-PrivadoVPN
    • NordVPN
    • 廉价王者-Surfshark
    • PrivateInternetAccess
    • 解锁一切-PrivateVPN
  • 公益资源
    • AI导航
    • 工具下载
    • Docker镜像加速
  • 友情链接
    • tickcloudTickcloud
老E的博客
专注记录并分享跨境技术应用及随想
  1. 首页
  2. 技术应用
  3. 其他
  4. 正文

Systemd及服务配置文件

2023年10月20日 1688次阅读 0条评论
clawcloud
expressvpn best vpn
privado vpn
surfshark vpn
private vpn
pia vpn
nord vpn

Systemd 是 Linux 系统的一个系统和服务管理器,它的目的是要取代传统的 init 系统,提高系统的启动速度和管理效率。Systemd 的特点有以下几个方面:

  • Systemd 可以按需启动服务,减少系统资源消耗;
  • Systemd 可以并行启动服务,解决服务之间的依赖关系,缩短系统启动时间;
  • Systemd 使用 CGroup 跟踪和管理进程的生命周期,实现了服务之间的隔离和资源控制;
  • Systemd 统一管理服务日志,使用二进制格式保存日志信息,提高了日志的安全性和可读性;
  • Systemd 支持快照和系统恢复,可以在出现问题时恢复到之前的状态。

1.服务(service)和目标(target)

Systemd 的核心概念是 Unit(单元),它是系统资源的基本单位,可以是一个服务、一个设备、一个挂载点、一个定时器等。每个 Unit 都有一个对应的 Unit 文件(单元文件),用来定义 Unit 的属性、依赖关系、启动命令等。Systemd 支持 12 种类型的 Unit 文件,分别用不同的扩展名来区分。Systemd 还有一个特殊的 Unit 类型叫做 Target(目标),它用来对 Unit 文件进行逻辑分组,相当于 SysV-init 中的运行级别。

举例而言,在 A.service 的[Unit] 配置块中定义After=B.service或After = network.target,那么A.service 会在 B.service 启动之后启动或者network.target 之后启动。对于后者,A.service要等待网络管理服务启动后才能启动。这样可以保证服务在启动时有网络可用,或者在关闭时在网络断开之前停止。但是,这并不意味着网络已经配置好了,只是意味着网络管理服务已经启动了。如果需要让一个服务在网络配置好后才启动,应该使用 After = network-online.target。

这里就引出了服务(service)和目标(target),两者并不是相同的,尽管看似用法一样。target 不是服务,是 systemd 的一种特殊的单元(unit)类型,用来对其他单元进行逻辑分组,相当于 SysV-init 中的运行级别(runlevel)。目标的扩展名是 .target,而不是 .service,因为它们不是真正的服务,而是一种同步点,用来表示系统启动或关闭的某个阶段。

服务(service)和目标(target)的区别可从以下几方面加以比较:

  • 功能:服务是用来执行一个具体的任务或功能的单元,如启动一个程序或运行一个脚本。目标是用来表示系统启动或关闭的某个阶段的单元,如达到多用户模式或图形界面模式;
  • 类型:服务是一种特定的单元类型,它有 .service 为扩展名,有自己的配置文件和启动命令。目标也是一种特殊的单元类型,它有 .target 为扩展名,没有配置文件和启动命令,只是一个同步点;
  • 关系:服务可以依赖于其他服务或目标,也可以被其他服务或目标依赖。目标可以依赖于其他服务或目标,也可以被其他服务或目标依赖。但是,目标之间不能互相依赖,只能按照顺序启动或关闭;
  • 创建:服务可以由用户自己创建,也可以由软件包安装时自动创建。目标也可以由用户自己创建,也可以由系统默认提供。

2.Systemd管理工具

可以通过 systemctl 命令来管理 Unit 和 Target,可以用来启动、停止、重启、重载、查看状态、开机启动等操作。同时,Systemd 还提供了一个 journalctl 命令来查看日志信息,可以按照不同的条件进行过滤和排序。Systemd 还有一些其他的工具和命令,用来实现更多的功能和设置。

一项服务通过 systemd 守护、管理,service 文件一般会出现在以下位置:

  • /usr/lib/systemd/system/:这个目录是系统默认的 service 文件存放位置,一般由软件包安装时自动创建,不建议手动修改;
  • /etc/systemd/system/:这个目录是用户自定义的 service 文件存放位置,一般由系统管理员手动创建或修改,优先级高于 /usr/lib/systemd/system/;
  • /run/systemd/system/:这个目录是运行时的 service 文件存放位置,一般由 systemd 临时创建或修改,优先级高于 /etc/systemd/system/。

linux 系统的查找顺序是按照上述目录的顺序,从下到上,即先查找 /run/systemd/system/,然后查找 /etc/systemd/system/,最后查找 /usr/lib/systemd/system/。如果在多个目录中找到同名的 service 文件,那么只会使用优先级最高的那个文件。

3.服务配置文件

服务配置文件是用来定义 systemd 如何管理一个服务的文件,它通常以 .service 为后缀,放在 /etc/systemd/system 或 /usr/lib/systemd/system 目录下。服务配置文件一般包含以下几个部分:

  • [Unit] 配置块:用来描述服务的基本信息,如名称、描述、依赖关系等;
  • [Service] 配置块:用来定义服务的启动类型、启动命令、停止命令、重启策略等;
  • [Install] 配置块:用来定义服务的安装方式,如是否开机启动、属于哪个 target 等。

3.1 [Unit] 配置快

[Unit] 配置块是用来描述服务的基本信息,如名称、描述、依赖关系等。常见的配置项有:

Description=:设置服务的简单描述,可以用中文或英文。
Documentation=:设置服务的文档位置,可以是一个 URL 或一个本地文件路径。
After=:设置服务在哪些服务或目标之后启动,可以指定多个,用空格隔开。只涉及启动顺序,不涉及依赖关系。
Before=:设置服务在哪些服务或目标之前启动,可以指定多个,用空格隔开。只涉及启动顺序,不涉及依赖关系。
Wants=:设置服务与哪些服务或目标存在"弱依赖"关系,可以指定多个,用空格隔开。这表示如果被依赖的单元启动失败或停止运行,不影响当前服务继续执行。
Requires=:设置服务与哪些服务或目标存在"强依赖"关系,可以指定多个,用空格隔开。这表示如果被依赖的单元启动失败或异常退出,那么当前服务也必须退出。
Conflicts=:设置服务与哪些服务或目标存在"冲突"关系,可以指定多个,用空格隔开。这表示如果当前服务启动,那么冲突的单元必须停止;反之亦然。

3.2 [Service] 配置块

[Service] 配置块是用来定义服务的启动类型、启动命令、停止命令、重启策略等。常见的配置项有:

Type=:设置服务的启动类型,可以是以下几种值之一:

simple(默认值):ExecStart 字段启动的进程为主进程。
forking:ExecStart 字段将以 fork() 方式启动,此时父进程将会退出,子进程将成为主进程。
oneshot:类似于 simple,但只执行一次,Systemd 会等它执行完,才启动其他服务。
dbus:类似于 simple,但会等待 D-Bus 信号后启动。
notify:类似于 simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务。
idle:类似于 simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合。

ExecStart=:设置服务的启动命令,可以是一个可执行文件或一个脚本。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStartPre=:设置在 ExecStart 命令之前执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStartPost=:设置在 ExecStart 命令之后执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecReload=:设置重启服务时执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStop=:设置停止服务时执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
ExecStopPost=:设置在 ExecStop 命令之后执行的命令,可以指定多个,每个一行。如果需要传递参数,可以用空格隔开。如果需要指定多个命令,可以用分号隔开。如果需要取消之前的设置,可以设为空值。
Restart=:设置服务的重启策略,可以是以下几种值之一:

no(默认值):不重启服务。
always:无论服务以何种方式退出,都重启服务。
on-success:只有当服务正常退出时(退出码为 0),才重启服务。
on-failure:只有当服务异常退出时(退出码非 0 或被信号终止),才重启服务。
on-abnormal:只有当服务被信号终止或超时退出时,才重启服务。
on-abort:只有当服务被 SIGABRT 信号终止时,才重启服务。
on-watchdog:只有当服务触发了看门狗超时时,才重启服务。

RestartSec=:设置重启服务之间的时间间隔,默认为 100 毫秒。
TimeoutStartSec=:设置启动服务的超时时间,默认为 90 秒。
TimeoutStopSec=:设置停止服务的超时时间,默认为 90 秒。
Environment=:设置服务的环境变量,可以指定多个,每个一行。格式为 key=value 的键值对。如果需要取消之前的设置,可以设为空值。
EnvironmentFile=:设置服务的环境变量文件,可以是一个 URL 或一个本地文件路径。文件内部的 key=value 键值对,可以用 $key 的形式,在当前配置文件中获取。如果文件不存在或无法读取,会导致错误。如果需要抑制错误,可以在路径前加上一个连词号(-)。

3.3 [Install] 配置块

[Install] 配置块是用来定义服务的安装方式,如是否开机启动、属于哪个 target 等。常见的配置项有:

WantedBy=:设置当前服务属于哪些 target 的依赖项(Wants),可以指定多个,用空格隔开,这样在启动这些 target 时,会自动启动当前服务。
RequiredBy=:作用类似WantedBy。同时,如果当前服务启动失败或异常退出,那么这些 target 也必须退出。
Also=:设置与当前服务同时安装或卸载的其他单元文件(不一定是 service 类型),可以指定多个,用空格隔开。
有关systemd的详细学习资料,老E推荐systemd.io站点,非常详细的分析、说明了systemd及其配置所有细节。
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: Linux系统运维 systemd
最后更新:2024年5月27日

老E

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

站内搜索
归档
  • 2025 年 5 月
  • 2025 年 4 月
  • 2025 年 3 月
  • 2025 年 2 月
  • 2025 年 1 月
  • 2024 年 12 月
  • 2024 年 11 月
  • 2024 年 10 月
  • 2024 年 9 月
  • 2024 年 8 月
  • 2024 年 7 月
  • 2024 年 6 月
  • 2024 年 5 月
  • 2024 年 4 月
  • 2024 年 3 月
  • 2024 年 2 月
  • 2024 年 1 月
  • 2023 年 12 月
  • 2023 年 11 月
  • 2023 年 10 月
  • 2023 年 9 月
  • 2023 年 8 月
  • 2023 年 7 月
  • 2023 年 6 月

Copyright ©2023-2025 Appscross. All Rights Reserved.