Posso usar um link simbólico como serviço do systemd?

14

Por exemplo, eu tenho um serviço nomeado mysshd.serviceno /usr/lib/systemd/system/diretório Posso criar um link simbólico como:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

para que qualquer operação que eu faça com o fool.service seja refletida em mysshd.service( systemctl enable/disable start/stop fool.servce)?

Meu objetivo é substituir o serviço sshd nativo por um link simbólico do meu próprio serviço sshd.

usuario
fonte
1
Por que não adicionar e ativar seu serviço e desativar o serviço sshd nativo?
Lambert
Quero que meu software seja compatível com a versão anterior, que usou um link simbólico /etc/init.d/ssh -> /etc/init.d/myssh.
entalhe
Ainda não entendi exatamente o que você quer dizer, mas de acordo com a sua linha <quote>, para que qualquer operação que eu faça com o fool.service seja refletida no mysshd.service (systemctl habilitar / desabilitar start / stop fool.servce)? </ Quote > você pode dar uma olhada nas dependências do systemd (consulte wiki.archlinux.org/index.php/systemd#Handling_dependencies ) para iniciar / ativar seu serviço após o sshd.
Lambert
@ Nick bem-vindo ao Stack Exchange! no Stack Exchange, é habitual mostrar elogios pelas respostas, votando novamente. você pode fazer isso clicando na seta para cima à esquerda da resposta. se minha resposta resolveu seu problema, você também pode clicar na caixa de seleção para marcá-la como aceita. obrigado!
strugee

Respostas:

9

Até onde eu sei, o systemd não vai lidar com isso particularmente bem. Pelo que entendi, você deseja substituir o comportamento de sshd.service, certo?

Felizmente para você, o systemd foi projetado para esse tipo de coisa. Basta colocar sua definição de serviço /etc/systemd/system/ssh.service, executar systemctl daemon-reloadpara recarregar os arquivos da unidade, e o systemd usará automaticamente essa configuração em vez do sistema ssh.service.

Quer systemctl enable mysshd.servicetrabalhar também? Sem problemas. Na [Install]seção do seu arquivo de unidade, adicione uma linha que diz Alias=mysshd.service. Em seguida, execute systemctl reenable ssh.servicepara que o systemd conserte os links simbólicos da unidade, e você estará dourado.

Agora, você não forneceu detalhes sobre o que mysshd.servicedeve fazer. Se é completamente diferente do normal ssh.service, ótimo! Use o método acima. No entanto, se você quiser apenas mudar uma coisa pequena, está usando a abordagem errada. O systemd permite criar "trechos" de arquivos de unidades que serão aplicados sobre os arquivos de unidades normais. Isso permite adicionar ou substituir diretivas individuais enquanto permite que o restante do arquivo da unidade receba atualizações do gerenciador de pacotes. Para fazer isso, basta criar /etc/systemd/system/ssh.d/my-custom-config.conf(você pode mudar my-custom-config.confpara o que quiser e também pode ter vários arquivos de substituição). Nesse arquivo, coloque as diretivas que você deseja alterar ou adicione às habituais ssh.service. Você pode até adicionar Alias=diretivas, para que systemctl start mysshd.servicefuncione! Lembre-se de executarsystemctl daemon-reloaddepois que você fez (e, se você usou Alias=, systemctl reenable ssh.service).

Como um aparte, nunca, nunca altere os arquivos da unidade systemd /usr/lib/systemd. Sempre! O padrão de hierarquia do sistema de arquivos exige que /usrseja tratado como somente leitura. Na prática, isso significa que o gerenciador de pacotes lida com /usr(exceto /usr/local) e você não toca no que o gerenciador de pacotes lida - especialmente porque o que quer que você altere provavelmente será sobrescrito. Em vez disso, coloque suas coisas em algum lugar como /etc.

strugee
fonte
1
Para esclarecer um pouco: se você deseja substituir foo.service, execute sudo systemctl edit foo.servicee ele salvará o que você digitou /etc/systemd/system/foo.service.d/override.conf.
Rockallite 16/03/19
Além disso, a Alias=diretiva NÃO funciona em arquivos de substituição. Veja github.com/systemd/systemd/issues/1090
Rockallite
@Rockallite não sabia systemctl editno momento em que escrevi esta resposta. fique à vontade para editar minha resposta para refletir o Alias=erro (insira "OK com o respondente" ou algo na mensagem de edição). boa pegada.
strugee
5

Use linkcom o caminho completo:

systemctl link /home/nick/myservice.service

Observe que você não pode vincular um arquivo de serviço que já é um link.

Gunar Gessner
fonte