Tenho que unidades Systemd de um serviço e um soquete. O comportamento desejado é que quando eu iniciar o soquete o serviço será iniciado primeiro seguido pelo soquete e quando qualquer um for desativado ambos devem ser desativados. O serviço se vincula ao soquete antes que a unidade de soquete seja iniciada, e é por isso que o tenho como um serviço de notificação para que ele não relate como iniciado até que tenha o vínculo no soquete.
Aqui estão os arquivos das duas Unidades.
#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
A mensagem de erro é a seguinte.
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
Pelos recursos, parece que significa que o ciclo está acontecendo apenas com esses dois arquivos e eu posso limpar o erro removendo a linha After do arquivo .socket, mas então eles inicializam simultaneamente e o executável para o serviço falha. Eu provavelmente poderia resolver isso simplesmente adicionando um sleep ao socket, mas não vejo informações de dependência suficientes aqui para causar um ciclo.
Eu tentei limpar /{lib,etc}/systemd/system do serviço e do arquivo de socket e reinstalar os que foram colados aqui só para ter certeza de que versões mais antigas não estavam em execução e, claro, executar systemctl daemon-reload regularmente enquanto o modificava. Mas não consigo entender por que especificar depois quebra o gráfico de dependências mesmo depois de remover as dependências do arquivo de serviço.
Onde está acontecendo o loop que estou perdendo?