我必须将一个服务和一个套接字设置为 Systemd 单元。期望的行为是,当我启动套接字时,服务将首先启动,然后是套接字,当其中一个被关闭时,它们都应该关闭。服务在套接字单元启动之前绑定到套接字,这就是为什么我将其作为通知服务,这样它就不会报告为已启动,直到它在套接字上绑定。
这是两个单位的文件。
#rustyvxcan.service
[Unit]
Description=Docker VXCAN plugin Service
#PartOf=rustyvxcan.socket
Before=docker.service
After=network.target
[Service]
Type=notify
ExecStartPre=/usr/bin/mkdir -p /run/docker/plugins
ExecStart=/home/braedon/.cargo/bin/rustycan4docker
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
#rustyvxcan.socket
[Unit]
Description=A network plugin for vxcan
Before=docker.service
AssertPathExists=/run/docker/plugins
Requires=rustyvxcan.service
After=rustyvxcan.service
[Socket]
ListenStream=/run/docker/plugins/rustyvxcan.sock
RemoveOnStop=True
[Install]
WantedBy=sockets.target
错误信息如下。
Sep 19 16:50:38 localhost systemd[1]: rustyvxcan.service: Found ordering cycle on rustyvxcan.socket/start
Sep 19 16:50:38 localhost systemd[1]: rustyvxcan.service: Found dependency on rustyvxcan.service/start
Sep 19 16:50:38 localhost systemd[1]: rustyvxcan.service: Unable to break cycle starting with rustyvxcan.service/start
Sep 19 16:55:09 localhost systemd[1]: rustyvxcan.socket: Found ordering cycle on rustyvxcan.service/start
Sep 19 16:55:09 localhost systemd[1]: rustyvxcan.socket: Found dependency on rustyvxcan.socket/start
Sep 19 16:55:09 localhost systemd[1]: rustyvxcan.socket: Unable to break cycle starting with rustyvxcan.socket/start
从资源来看,这意味着循环只发生在这两个文件中,我可以通过从 .socket 文件中删除 After 行来清除错误,但它们同时启动,服务的可执行文件失败。我可能只需在套接字中添加一个睡眠即可解决这个问题,但我在这里没有看到足够的依赖信息来导致循环。
我尝试清除 /{lib,etc}/systemd/system 中的服务和套接字文件,然后重新安装粘贴在此处的文件,以确保旧版本未运行,当然,在修改它时定期运行 systemctl daemon-reload。但我似乎无法弄清楚为什么即使在从服务文件中删除依赖项后,指定 after 也会破坏依赖关系图。
我遗漏了发生循环的地方在哪里?