原创

Systemd详解

温馨提示:
本文最后更新于 2024年09月28日,已超过 229 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

一.简介

systemd 是一个系统和服务管理器,它作为系统的初始化和系统管理服务守护进程运行,负责启动和管理系统上的服务。在 systemd 系统中,服务文件(通常位于 /etc/systemd/system/ 或 /lib/systemd/system/ 目录下)定义了服务的启动行为、依赖关系、环境变量等。这些文件通常具有 .service 扩展名。systemctl 是 Linux 系统中用于控制系统和服务管理器(systemd)的命令工具。

二.服务文件的基本结构

一个典型的 .service 文件通常包含以下几个部分:

  • [Unit] 部分
  • [Service] 部分
  • [Install] 部分

2.1.[Unit] 部分

[Unit] 部分包含服务的元数据和依赖关系。

  • Description:服务的简短描述。
  • Documentation:文档链接。
  • After:指定该服务在哪些服务之后启动。
  • Before:指定该服务在哪些服务之前启动。
  • Wants:指定该服务启动时希望启动的服务。
  • Requires:指定该服务启动时必须启动的服务。
  • Conflicts:指定该服务启动时不能启动的服务。

示例

[Unit]
Description=My Custom Service
Documentation=https://example.com/docs
After=network.target

2.2.[Service] 部分

[Service] 部分包含服务的启动和运行时配置。

  • Type:指定服务的类型,常见的有 simple、forking、oneshot、notify 等。
    • simple:默认值,表示服务由 ExecStart 指令启动,并且立即准备就绪。
    • forking:表示服务通过 fork 方式启动,父进程退出后服务才被认为启动成功。
    • oneshot:表示服务只运行一次,完成后退出。
    • notify:表示服务通过 sd_notify 通知 systemd 服务已准备好。
  • ExecStart:指定启动服务的命令。
  • ExecStop:指定停止服务的命令。
  • ExecReload:指定重新加载服务配置的命令。
  • Restart:指定服务在失败后是否自动重启,常见的有 no、on-failure、on-abnormal、always 等。
  • RestartSec:指定服务重启前的等待时间(秒)。
  • User:指定运行服务的用户。
  • Group:指定运行服务的用户组。
  • Environment:指定环境变量。
  • WorkingDirectory:指定服务的工作目录。
  • PIDFile:指定 PID 文件的路径。
  • TimeoutStartSec:指定服务启动超时时间(秒)。
  • TimeoutStopSec:指定服务停止超时时间(秒)。

示例

[Service]
Type=simple
ExecStart=/usr/local/bin/my_service
ExecStop=/usr/local/bin/my_service stop
ExecReload=/usr/local/bin/my_service reload
Restart=on-failure
RestartSec=10
User=myuser
Group=mygroup
Environment=MY_VAR=value
WorkingDirectory=/var/lib/my_service
PIDFile=/run/my_service.pid

2.3.[Install] 部分

[Install] 部分包含服务安装时的配置。

  • WantedBy:指定服务被哪些 target 启动。
  • RequiredBy:指定服务被哪些 target 需要。
  • Alias:指定服务的别名。

示例

[Install]
WantedBy=multi-user.target

三.位置

3.1./etc/systemd/system/

用途:这个目录通常用于存放用户自定义的服务单元文件和覆盖文件。管理员可以在这里创建或修改服务单元文件,以覆盖默认的配置或添加特定的系统级服务。

优先级:Systemd会优先使用这个目录下的文件。如果同一个服务在/lib/systemd/system/(或/usr/lib/systemd/system/)和/etc/systemd/system/中都有配置文件,systemd会优先使用/etc/systemd/system/中的文件。

持久性:修改或创建在这个目录下的文件不会被软件包更新所覆盖,因此适合用于持久化的自定义配置。

3.2./lib/systemd/system/ 或 /usr/lib/systemd/system/

用途:这两个目录(取决于具体的Linux发行版)通常由软件包管理器(如yum、apt或dnf)管理,用于存放系统级的默认服务单元文件。这些文件通常是由操作系统或软件包安装时自动放置的。

来源:这些文件通常是由操作系统发行版或软件包安装程序在软件安装过程中自动创建的。

优先级:相对于/etc/systemd/system/目录下的文件,这些目录中的文件具有较低的优先级。如果两个目录中存在同名的服务单元文件,systemd将优先使用/etc/systemd/system/中的文件。

四.注意事项

4.1.daemon-reload

在修改或添加服务文件后,需要运行以下命令以使更改生效。

systemctl daemon-reload

4.2.权限

确保服务文件具有适当的权限,通常是 644(即 -rw-r--r--)。

正文到此结束