我不确定守护脚本的一般方法是什么。例如,我在网上搜索过,如果我试图编写一个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