Não quero remover o serviço, só quero evitar que ele inicie na inicialização. Ainda preciso da opção de iniciá-lo manualmente mais tarde (com o systemctl start <service>
comando).
Eu tentei usar systemctl disable <service>
. Não funciona, porque remove o serviço.
Há outra possibilidade. Em seu arquivo de serviço,
[Install]
#WantedBy=multi-user.target
poderia ser comentada (e então, systemctl daemon-reload
). Funciona no caso dos meus próprios serviços, porque seus arquivos de serviço foram escritos por mim.
No entanto, os arquivos de serviço pertencentes à distribuição estão em formato /lib/systemd/system
. Os arquivos neste diretório são gerenciados pelo sistema operacional, ou seja, eles seriam substituídos por atualizações, outras partes do sistema podem supor que eles não foram modificados e assim por diante. Simplesmente editar arquivos do sistema fora do /etc
é uma prática ruim, e eu não quero fazer isso. Não quero editar arquivos de configuração no meu arquivo /lib
.
O que fazer?
systemctl disable
é a maneira correta de fazer isso; ele ainda permite iniciar uma unidade manualmente, mesmo que não apareça nasystemctl --all
saída do ' — para listar todas as unidades inicializáveis, você deve executarsystemctl list-unit-files
. Para tornar uma unidade não inicializável, você precisamask
disso.Se você realmente quiser, poderá substituir os serviços fornecidos pelo sistema definidos em
/lib
adicionando arquivos em/etc
, e alterar o destino desejado;systemctl edit yourunit
fará a coisa certa: ele abre um editor, permitindo que você substitua apenas as configurações que lhe interessam, e ele armazenará o resultado no lugar certo, como um “snippet” de substituição. As atualizações feitas em configurações não substituídas nos serviços fornecidos pelo sistema ( por exemplo , por atualizações de pacotes) serão levadas em consideração de forma transparente.Eu não esperava escrever uma resposta tão longa, mas você parece estar tentando coisas diferentes com o systemd, e suponho que você esteja mais interessado em seu mecanismo do que simplesmente digitar um comando mágico uma vez e esquecer que ele existia. E eu posso falar sobre o systemd por muito, muito mais tempo!
EU.
A resposta de Stephen Kitt é muito boa e exaustiva do ponto de vista da administração (e estou de bom grado votando nela), quando você , como administrador, deseja desabilitar um serviço de iniciar ou ser habilitado. Como a documentação do systemd v241 diz (consulte
man 5 systemd.unit
):systemctl mask
faz exatamente isso: cria um link simbólico com o mesmo nome da unidade/etc
e vincula o arquivo de serviço ao/dev/null
. Como o systemd procura/etc
primeiro (a ordem é dada no mesmo manual, nas primeiras linhas) e encontra a unidade nomeada, ele descobre que a unidade está mascarada. Ele foi projetado para isso e, por favor, use-o se quiser impedir que um serviço seja ativado e iniciado. É a solução mais simples, de comando único, que sobrevive a uma reinicialização. Mantenha simples o que pode ser feito simples.II.
No entanto, se você estiver projetando um conjunto de serviços que dependem uns dos outros, na função de um integrador de sistemas em vez de administrador, faz sentido declarar o serviço não inicializável ou imparável com o
systemctl
comando, enquanto ainda permite outros mecanismos (sockets, dbus etc.) para iniciá-lo sob demanda. Para isso, o systemd possui configurações, também descritas no mesmo manual:RefuseManualStart=
eRefuseManualStop=
:Você pode habilitar esse serviço, mas ele se recusará a iniciar
systemctl start
(ou parar, para a outra configuração), evitando um erro do operador.III.
Um ponto a ser elaborado, sugerido pela sua ideia de comentar a
[Install]
seção no arquivo de serviço:Não faça isso se o serviço vier com o sistema , ou seja, quando o arquivo da unidade estiver em algum lugar abaixo da
/lib
hierarquia! Uma atualização a substituirá silenciosamente ou solicitará que você intervenha manualmente para mesclar as alterações. systemd tem um mecanismo melhor para isso. Por convenção (para serviços do sistema), o diretório do systemd sob/etc
é "seu", mas um sob/lib
pertence à distro.Se, por exemplo, você deseja remover a
WantedBy=
cláusula da[Install]
seção, você deve usar o mecanismo apropriado do systemd para aplicar pequenos ajustes nos serviços: use o comandosudo systemctl edit servicename.service
. O systemd abrirá um editor para você e, inicialmente, o arquivo estará vazio.A próxima propriedade útil do systemd que vem a calhar é que quando um valor de palavra-chave é uma lista (como
WantedBy
), atribuir a ele uma string vazia redefine a lista (há inconsistências em diferentes versões, mas na maioria das vezes funciona. No nosso caso faz). No editor, você adiciona duas linhas (isso é apenas uma elaboração do conceito que você tentou, mas não chegou a uma solução de trabalho; já sabemos que você conseguirá o que deseja mascarando) :Isso redefine a
WantedBy
lista para vazia. Se você quiser adicionar outra dependência, basta colocar outra linha com a mesma chave (outroWantedBy=another.service
, em nosso exemplo mal concebido). O que realmente acontece nos bastidores, o systemd cria um arquivo de substituição/etc
em , i. e. em seu diretório, proprietário da máquina, e promete nunca tocá-lo. O arquivo que o systemd cria é nomeado, assumindo o layout de diretório padrão,/etc/systemd/system/servicename.service.d/override.conf
. Aqui a parte servicename.service é exatamente o nome da unidade que você está substituindo. systemd respeita todos os arquivos neste novo subdiretório, então pode haver mais do que apenasoverride.conf
; apenas lembre-se de que eles serão aplicados em ordem lexicográfica de nomes, o mais baixo primeiro (comols -1 *.conf | LC_ALL=C sort
os mostraria).Embora não seja um mecanismo correto no seu caso, como Peter já respondeu em um comentário de acompanhamento, às vezes é útil quando você deseja, por exemplo, adicionar uma variável de ambiente ou até mesmo contornar um bug ¹, como
Você pode verificar se sua substituição foi incorporada à configuração da unidade usando
systemctl show
myunit.service . Sua saída é muito detalhada, então use grep:Não é o exemplo mais claro do mundo para ler, pois a linha é muito longa; Eu retirei a maior parte onde
[...]
estão os marcadores, mas você pode identificar[email protected]
na lista. É uma boa prática sempre verificar se a alteração de configuração realmente chegou às configurações combinadas da unidade, mesmo antes de tentar iniciar/parar/inicializar/hibernar e outros cenários diferentes. Erros de ortografia acontecem.4.
Naturalmente, você pode ajustar qualquer tipo de unidade, não apenas serviços: temporizadores, soquetes, montagens etc. Mesmo os arquivos de unidade gerados dinamicamente no
/run
diretório respeitam esses ajustes. Por exemplo, embora no caso a seguir a/opt
montagem seja montada usando seu/etc/fstab
, o systemd gera uma unidade temporáriaopt.mount
para ele no diretório do sistema de arquivos na RAM/run/systemd/system
. Esta unidade temporária reconhece perfeitamente um adicionalWants=
especificado em/etc/systemd/system
. E, a propósito, o serviço que ele quer é um exemplo de uso corretoRefuseManualStart
de andRefuseManualStop
: ele deve fazer seu trabalho apenas na/opt
montagem e desmontagem do sistema de arquivos, e travaria ou cuspiaria erros se iniciado manualmente. Pior ainda, énão iniciaria logo após a/opt
montagem do sistema de arquivos, se já tivesse sido iniciado manualmente!O serviço também mostra o padrão de "vinculação forte" especificando
BindsTo=opt.mount
eAfter=opt.mount
. Citando o manual do systemd.unit(5), em "[UNIT] SECTION OPTIONS/BindsTo=", com minhas adições entre colchetes para tornar a linguagem mais digerível:A implicação aqui é que esta unidade é iniciada depois e parada antes
opt.mount
de ser parada, em um passo firme.* * *
systemd é um sistema grande, poderoso e flexível, e, se você estiver procurando ajustar seu sistema da melhor maneira possível, leia sua documentação em
man
Web quando estiver entediado com outras coisas certamente é benéfico.¹ O bug foi corrigido há mais de um ano, e a correção chegou à versão 245 do systemd, mas como estou reunindo uma frota de várias distribuições e, às vezes, acumulando VMs de imagens mais antigas, tenho que manter isso por um tempo. O Debian 10 tem um pré-fixo v241 do systemd; apenas o Debian 11 vem com v247. Os sistemas de produção são atualizados lentamente, então a solução é permanecer por mais alguns anos.