在 Linux 上创建自定义 Systemd 服务的分步指南

在 Linux 上创建自定义 Systemd 服务的分步指南

掌握 Linux 中的自定义 Systemd 服务:综合指南

Systemd 是各种 Linux 发行版中强大而动态的初始化系统。它有助于程序执行、资源管理和整体系统控制。本指南将帮助您通过在 Ubuntu 中创建个性化服务单元来充分利用 Systemd 的潜力。

了解 Systemd 服务单元

服务单元本质上是一个标准化文件,概述了执行特定应用程序所需的配置。它封装了有关程序的元数据、执行指令以及有关会话期间 Systemd 访问框架的详细信息。

Systemd 支持的环境中的每个守护进程都由服务文件控制。例如,OpenSSH 使用ssh.service位于的单元/etc/systemd/system/来指示其在 Debian 和 Ubuntu 系统中的运行。

显示 OpenSSH 服务单元的终端。

通常,服务单元文件分为三个主要部分:UnitServiceInstallUnit部分表示应用程序的元数据和依赖项,而Service部分指定其位置和执行方法。 最后,Install部分阐明了何时可以由 Systemd 启动应用程序。

创建系统级自定义服务

自定义服务对于自动执行需要提升权限或使用 Systemd 计时器的任务非常有用。一个典型的例子是确保您的 Minecraft 服务器在系统重启后可靠地启动。

创建自定义系统级服务的步骤

  • 创建 Systemd 单元文件:首先在您的主目录中创建一个新的单元文件。
  • nano ~/my-system-app.service
  • 插入配置:在新单元文件中添加以下模板。这是一个有效的基础配置:
  • [Unit] Description=My First Service After=network.target [Service] Type=simple ExecStart=/path/to/bin Restart=always [Install] WantedBy=multi-user.target
  • 定制您的服务:调整DescriptionExecStart字段以添加与您的服务相关的详细信息。
  • 移动文件:保存并传输至服务目录:
  • sudo cp ~/my-system-app.service /etc/systemd/system/
  • 重新加载 Systemd Daemon:执行命令重新加载服务:
  • sudo systemctl daemon-reload
  • 启动您的服务:启动您的自定义系统级服务:
  • sudo systemctl start my-system-app.service
  • 验证功能:确认您的服务可以运行:
  • systemctl status my-system-app.service
终端显示自定义服务正常运行。

建立用户级定制服务

Systemd 支持使用 Systemd-user 创建无根服务,允许非 root 用户有效地处理个人应用程序,同时通过最小化 root 访问权限来增强安全性。

如何创建用户级自定义服务:

  • 设置单元文件:在主目录中创建一个新的单元文件。
  • nano ~/my-user-app.service
  • 插入基本配置:在单元文件中使用以下框架:
  • [Unit] Description=My First User Service After=graphical-session.target [Service] Type=simple ExecStart=/path/to/bin [Install] WantedBy=default.target
  • 调整 ExecStart:ExecStart确保您的用户帐户可以访问指定的路径。
  • 创建用户的本地 Systemd 目录:
  • mkdir -p ~/.config/systemd/user/
  • 复制单元文件:将您的自定义服务单元传输到本地目录:
  • cp ~/my-user-app.service ~/.config/systemd/user/
  • 为用户重新加载 Systemd:验证 Systemd 检查用户目录是否有更改:
  • systemctl daemon-reload --user
  • 检查服务状态:确保您的用户服务被正确识别:
  • systemctl --user status my-user-app.service
显示 systemctl 中识别的自定义用户服务的终端。

优化您的自定义 Systemd 服务

Systemd 的灵活性允许用户精细地调整服务参数和行为。

集成环境变量

环境变量无需修改配置文件即可为 Linux 程序提供附加上下文,并且 Systemd 支持将其合并到服务单元中。

  • 禁用服务:首先禁用您想要修改的服务:
  • systemctl --user disable --now my-user-app.service
  • 编辑您的服务文件:在您喜欢的文本编辑器中打开单元文件:
  • sudo nano ~/.config/systemd/user/my-user-app.service
  • 修改服务部分:在此部分下[Service],包括:
  • Environment="VARIABLE_NAME=VALUE"
  • 重新加载守护进程:保存并重新加载 Systemd 守护进程以应用更改:
  • systemctl --user daemon-reload
  • 重新启动服务:使用新的环境变量重新启动:
  • systemctl --user start my-user-app.service
显示具有修改后的环境变量的服务的终端。

限制资源使用

Systemd 提供了规范服务资源使用的机制,以确保公平利用。

  • 禁用目标服务:首先完全禁用它:
  • sudo systemctl disable my-system-app.service
  • 编辑单元文件:使用以下命令打开服务文件:
  • sudo nano /etc/systemd/system/my-system-app.service
  • 添加资源限制:例如,限制内存:
  • MemoryHigh=SIZE
  • 重新加载单位更改:重新加载新设置:
  • sudo systemctl daemon-reload
  • 监控资源使用情况:通过以下方式跟踪服务性能:
  • systemd-cgtop
显示 systemd-cgtop 输出的终端。

结论

探索 Systemd 可释放 Linux 进程管理的巨大潜力。通过创建自定义服务(从自动执行任务到管理资源效率),您可以显著增强系统的互操作性和性能。深入了解 Systemd 及其广泛的功能,并考虑探索 Run0 相对于 Sudo 的比较优势,以获得更细致的理解。

图片来源:Mikhail Fesenko via Unsplash。所有修改和截图均由 Ramces Red 提供。

常见问题

1.与传统的 init 系统相比,使用 Systemd 服务有哪些优势?

Systemd 提供并行服务启动、依赖管理和统一的服务处理方法,与传统的 init 系统相比,提高了整体性能和可靠性。

2.我可以为单个应用程序创建多个服务吗?

是的,您可以为单个应用程序创建多个服务单元来管理不同的方面,例如从不同的配置启动或在特定条件下启动。

3.如何解决 Systemd 服务的问题?

您可以使用命令来排除 Systemd 服务的故障,例如journalctl -u my-service-name.service检查日志,以及systemctl status my-service-name.service调查当前状态和错误消息。

来源和图片

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注