使用 systemd 创建守护进程的方法有哪些?

使用 systemd 创建守护进程的方法有哪些?

我不确定守护脚本的一般方法是什么。例如,我在网上搜索过,如果我试图编写一个Python脚本来检查我的计算机上每秒的时间,我所能想到的就是使用systemd来启动它,然后在Python中编写脚本用定时器结束循环。

这对我来说既没有多大意义,也不是一种很好的守护方式。我对 systemd 所做的就是使用它在启动时运行脚本(以及任何脚本),因此 systemd 本身似乎不是很有用。我想我的脚本守护进程可能是错误的,所以你知道使用 systemd 将 python 脚本变成守护进程的更好方法是什么吗?

谢谢

答案1

systemd并不是包罗万象的。这不会是解决方案每一个问题,但是它确实给了你很多帮助您解决问题的工具。这些工具的有用性取决于您如何使用它们。

让我们看一下一个非常基本的服务文件check-time.service(请注意,我使用位于/usr/lib/systemd/system/作为参考的其他服务文件手动创建了此服务文件):

[Unit]
Description=Checks the time every second

[Service]
Type=simple
ExecStart=/usr/bin/check-time.py

该服务文件属于/usr/lib/systemd/system//etc/systemd/system/systemd


逐行

[*]节标题。这些只是将指令组合在一起。您可以在手册页中找到对哪些指令所属位置的引用systemd

[单元]部分

[服务]部分

[安装]部分

描述

描述单位的自由格式字符串。这旨在用于 UI 中以显示描述性信息以及单位名称。描述应包含对最终用户有意义的名称。 “Apache2 Web 服务器”就是一个很好的例子。不好的例子是“高性能轻量级 HTTP 服务器”(太通用)或“Apache2”(太具体,对于不了解 Apache 的人来说毫无意义)。

类型

配置该服务单元的进程启动类型。 simple、fork、oneshot、dbus、notify 或idle 之一。

如果设置为 simple(如果既没有指定 Type= 也没有指定 BusName=,但指定了 ExecStart=,则为默认值),则预计使用 ExecStart= 配置的进程是服务的主进程。在此模式下,如果进程向系统上的其他进程提供功能,则应在守护进程启动之前安装其通信通道(例如,由 systemd 通过套接字激活设置套接字),因为 systemd 将立即开始后续操作单位。

执行启动

启动此服务时执行的带有参数的命令。根据下面描述的规则,该值被分成零个或多个命令行(请参阅下面的“命令行”部分)。


概括

/usr/bin/check-time.py该服务文件在启动时只会运行命令。如果命令退出,那么它将被视为“死”,只要它继续运行,它就被视为“活动”。

这个服务文件有多大用处?嗯,不是很。因为它唯一做的就是允许您使用systemctl start check-time.service而不是正常的完整路径来运行 python 脚本,但是还有大量有用的其他选项。


有用的选项

通缉者如果您希望该服务在启动时启动,请设置WantedBy=默认目标。

重新开始确定何时systemd应自动重新启动服务,例如“始终”或“失败时”

从字面上看,还有数百个其他选项,包括限制硬件使用、使用哪个用户来执行进程、设置环境变量、设置依赖项等等。systemd对于它提供的所有附加功能都很有用,不仅仅是因为它可以包装东西。

答案2

不确定你问什么。 Systemd 是 init 系统,因此它的工作是在启动时运行进程。

编辑:要列出系统运行中的服务:

systemctl list-units --type service

相关内容