我编写了一些简单的守护进程,我希望我的系统在启动时自动启动它。我的守护进程需要启动蓝牙守护进程和用于输出数据的 UNIX 套接字。与大多数有关 systemd 的手册和教程中可以阅读的内容略有不同的是,从守护进程的角度来看,我希望 systemd 创建用于写入而不是侦听的套接字。当我手动启动服务和套接字时,一切正常,但是执行后systemctl enable foo.service
我的守护进程在重新启动后不会启动。基于和一些谷歌搜索man systemd.unit
,man systemd.target
我创建了 3 个单元文件。
由于似乎至少有几种方法可以描述 systemd 的依赖关系,我不知道出了什么问题,为什么我的服务在重新启动后没有自动启动。我应该创建 foo.target 文件还是在这种简单的情况下没有必要?我也不确定WantedBy
foo.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
。