困惑为什么 systemd 服务没有在启动时启动

困惑为什么 systemd 服务没有在启动时启动

我编写了一些简单的守护进程,我希望我的系统在启动时自动启动它。我的守护进程需要启动蓝牙守护进程和用于输出数据的 UNIX 套接字。与大多数有关 systemd 的手册和教程中可以阅读的内容略有不同的是,从守护进程的角度来看,我希望 systemd 创建用于写入而不是侦听的套接字。当我手动启动服务和套接字时,一切正常,但是执行后systemctl enable foo.service我的守护进程在重新启动后不会启动。基于和一些谷歌搜索man systemd.unitman systemd.target我创建了 3 个单元文件。

由于似乎至少有几种方法可以描述 systemd 的依赖关系,我不知道出了什么问题,为什么我的服务在重新启动后没有自动启动。我应该创建 foo.target 文件还是在这种简单的情况下没有必要?我也不确定WantedByfoo.socket 中是否应该设置为 foo.target 或更多可能设置为 sockets.target 。

下面是我的 3 个单元文件的代码片段。如果有人能看一下并给我一些提示,我将非常感激。

############ foo.service file #############################################
[Unit]
Description=Foo Service
Requires=foo.socket

[Service]
Type=simple
ExecStart=/path/to/start

[Install]
WantedBy=foo.target
###########################################################################
############ foo.socket file ##############################################
[Unit]
Description=Foo socket for write, not for listen

[Socket]
ListenDatagram=/run/foo/foo.sk

[Install]
WantedBy=foo.target
###########################################################################
############ foo.target file ##############################################
[Unit]
Description=Foo target
Requires=bluetooth.target
###########################################################################

答案1

您已指示systemd在目标启动时启动服务和套接字,但未指示目标不应在引导时启动。它没有[Install]部分——这就是为什么你的服务在启动时没有启动的原因。

对于这个简单的情况,目标不是必需的。将Requires=条款从您的目标移至您的服务。

对于WantedBy=您的服务,请尝试使用multi-user.target,或者如果您的服务需要网络,则使用network-online.target

相关内容