
掌握 Linux 中的自定义 Systemd 服务:综合指南
Systemd 是各种 Linux 发行版中强大而动态的初始化系统。它有助于程序执行、资源管理和整体系统控制。本指南将帮助您通过在 Ubuntu 中创建个性化服务单元来充分利用 Systemd 的潜力。
了解 Systemd 服务单元
服务单元本质上是一个标准化文件,概述了执行特定应用程序所需的配置。它封装了有关程序的元数据、执行指令以及有关会话期间 Systemd 访问框架的详细信息。
Systemd 支持的环境中的每个守护进程都由服务文件控制。例如,OpenSSH 使用ssh.service
位于的单元/etc/systemd/system/
来指示其在 Debian 和 Ubuntu 系统中的运行。

通常,服务单元文件分为三个主要部分:Unit
、Service
和Install
。Unit
部分表示应用程序的元数据和依赖项,而Service
部分指定其位置和执行方法。 最后,Install
部分阐明了何时可以由 Systemd 启动应用程序。
创建系统级自定义服务
自定义服务对于自动执行需要提升权限或使用 Systemd 计时器的任务非常有用。一个典型的例子是确保您的 Minecraft 服务器在系统重启后可靠地启动。
创建自定义系统级服务的步骤
- 创建 Systemd 单元文件:首先在您的主目录中创建一个新的单元文件。
- 插入配置:在新单元文件中添加以下模板。这是一个有效的基础配置:
- 定制您的服务:调整
Description
和ExecStart
字段以添加与您的服务相关的详细信息。 - 移动文件:保存并传输至服务目录:
- 重新加载 Systemd Daemon:执行命令重新加载服务:
- 启动您的服务:启动您的自定义系统级服务:
- 验证功能:确认您的服务可以运行:
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
sudo cp ~/my-system-app.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl start my-system-app.service
systemctl status my-system-app.service

建立用户级定制服务
Systemd 支持使用 Systemd-user 创建无根服务,允许非 root 用户有效地处理个人应用程序,同时通过最小化 root 访问权限来增强安全性。
如何创建用户级自定义服务:
- 设置单元文件:在主目录中创建一个新的单元文件。
- 插入基本配置:在单元文件中使用以下框架:
- 调整 ExecStart:
ExecStart
确保您的用户帐户可以访问指定的路径。 - 创建用户的本地 Systemd 目录:
- 复制单元文件:将您的自定义服务单元传输到本地目录:
- 为用户重新加载 Systemd:验证 Systemd 检查用户目录是否有更改:
- 检查服务状态:确保您的用户服务被正确识别:
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
mkdir -p ~/.config/systemd/user/
cp ~/my-user-app.service ~/.config/systemd/user/
systemctl daemon-reload --user
systemctl --user status my-user-app.service

优化您的自定义 Systemd 服务
Systemd 的灵活性允许用户精细地调整服务参数和行为。
集成环境变量
环境变量无需修改配置文件即可为 Linux 程序提供附加上下文,并且 Systemd 支持将其合并到服务单元中。
- 禁用服务:首先禁用您想要修改的服务:
- 编辑您的服务文件:在您喜欢的文本编辑器中打开单元文件:
- 修改服务部分:在此部分下
[Service]
,包括: - 重新加载守护进程:保存并重新加载 Systemd 守护进程以应用更改:
- 重新启动服务:使用新的环境变量重新启动:
systemctl --user disable --now my-user-app.service
sudo nano ~/.config/systemd/user/my-user-app.service
Environment="VARIABLE_NAME=VALUE"
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 可释放 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
调查当前状态和错误消息。
发表回复 ▼