Menu Close

16.6. 创建自定义单元文件

从头开始创建单元文件有多种用例:您可以运行自定义守护进程,创建某些现有服务的第二个实例 ,如使用 sshd 服务的第二个实例来创建自定义单元文件

另一方面,如果您只想修改或扩展现有单元的行为,请使用 修改现有单元文件 中的说明。

流程

以下流程描述了创建自定义服务的一般过程:

  1. 使用自定义服务准备可执行文件。这可以是自定义创建的脚本,也可以是软件供应商提供的可执行文件。如果需要,准备 PID 文件来保存自定义服务主要进程的恒定 PID。也可以包含环境文件来存储该服务的 shell 变量。确保源脚本可以执行(通过执行 chmod a+x)且不是交互式的。
  2. /etc/systemd/system/ 目录中创建一个单元文件,并确定它有正确的文件权限。以 root 用户身份执行:

    touch /etc/systemd/system/name.service
    
    chmod 664 /etc/systemd/system/name.service

    使用要创建的服务的名称替换 name。请注意,该文件不需要可执行。

  3. 打开上一步中创建的 name.service 文件并添加服务配置选项。根据您要创建的服务类型,您可以选择多种选项,请参见单元文件结构

    以下是网络相关服务的单元配置示例:

    [Unit]
    Description=service_description
    After=network.target
    
    [Service]
    ExecStart=path_to_executable
    Type=forking
    PIDFile=path_to_pidfile
    
    [Install]
    WantedBy=default.target

    其中:

    • service_description 是一个说明性描述,在 journal 日志文件和 systemctl status 命令的输出中显示。
    • After 设置可确保仅在网络运行时启动该服务。添加以空格分开的其它相关服务或目标列表。
    • path_to_executable 代表到实际可执行服务的路径。
    • type=forking 用于生成 fork 系统调用的守护进程。该服务的主要进程使用 path_to_pidfile 中指定的 PID 创建。在 重要 [Service] 部分选项查找其他启动类型。
    • WantedBy 指出该服务应该启动的目标。将这些目标视为运行级别旧概念的替代。
  4. root 用户身份执行以下命令来通知 systemd 已存在新的 name.service 文件:

    systemctl daemon-reload
    
    systemctl start name.service
    警告

    在创建新的单元文件或修改现有单元文件后,始终运行 systemctl daemon-reload 命令。否则,systemctl start 或者 systemctl enable 命令可能会因为 systemd 状态和磁盘中的实际服务单元文件不匹配而失败。请注意,对于有大量单元的系统来说,这需要很长时间,因为每个单元的状态必须在重新载入的过程中被序列化,然后再进行反序列化。