Por que um link é removido ao desativar um serviço? (um arquivo não é)

2

Desejo instalar meu próprio serviço, removendo um arquivo .service em /etc/systemd/system . Meu arquivo .service de origem está em /opt/something.service .

Eu tenho duas opções ao instalar:

  • cp /opt/something.service /etc/systemd/system
  • ln -s /opt/something.service /etc/systemd/system

Ambas as abordagens funcionam quando eu start e enable o serviço (o serviço funciona corretamente).

Há, no entanto, uma diferença ao desativar o serviço:

  • no caso da cópia, /etc/systemd/system/something.service permanece
  • no caso do link, /etc/systemd/system/something.service é removido

É por design? Isso é muito chato porque depois de desabilitar o serviço criado através de um link, não é suficiente para enable it - a unidade de serviço também deve ser recriada.

    
por WoJ 09.06.2016 / 19:11

3 respostas

3

Sim, isso ocorre por design.

A página man de systemctl disable diz:

Disables one or more units. This removes all symlinks to the specified unit files from the unit configuration directory, and hence undoes the changes made by enable. Note however that this removes all symlinks to the unit files (i.e. including manual additions), not just those actually created by enable.

Aqui está o link para isso: link

Ele não explica por que, mas posso arriscar um palpite de que não é possível diferenciar entre os links criados usando systemctl enable e os criados manualmente, pois está procurando por links que apontam para o arquivo de unidade.

Você deve usar a opção link em systemctl quando criar um link simbólico para um arquivo de origem fora do caminho de pesquisa do systemd. Também da mesma página de manual.

link FILENAME...

Link a unit file that is not in the unit file search paths into the unit file search path. This requires an absolute path to a unit file. The effect of this can be undone with disable. The effect of this command is that a unit file is available for start and other commands although it is not installed directly in the unit search path.

    
por 09.06.2016 / 20:25
1

Eu não tenho certeza da distro que você está usando, mas vou me aproximar do RHEL 7 (porque é isso que eu estou usando, e deve ser similar).

systemd normalmente procura por arquivos de serviço em /usr/lib/systemd/system/*.service (é possível ver outros links de serviço para ter uma ideia na sua distribuição)

Para ativar um serviço, ele deve ter uma seção [install] e, dentro dessa seção de instalação, ele deve ter uma tag WantedBy= . Esse WantedBy especifica sob quais condições ele deve ser ativado (como o nível de execução). O WantedBy deve corresponder a um diretório em /etc/systemd/system/*.target.wants .

Em seguida, se você ativar o serviço, um link será criado em /etc/systemd/system/*.target.wants/ para apontar para o arquivo de serviço em /usr/lib/systemd/system/ . Desativar o serviço só deve excluir este link também.

Por exemplo, se você tivesse um arquivo de serviço (test.service) que incluísse:

[install]
WantedBy=multi-user.target

então:

systemctl enable test.service

Criaria um link dentro de

/etc/systemd/system/multi-user.target.wants/

Chamado test.service que aponta para /usr/lib/systemd/system/test.service

E desativar o serviço só deve remover o link.

    
por 09.06.2016 / 19:30
0

Você deve ter links para seus serviços ativados. É uma prática ruim ter o arquivo real, só porque a ideia dessa pasta é permitir que você desative ou ative serviços, e não para salvar seus scripts dentro dela.

    
por 09.06.2016 / 19:59

Tags