Parece que sempre que tento desabilitar um serviço do systemd, o serviço encontra uma maneira de se reativar. O exemplo mais recente foi o PackageKit, que descobri ser a fonte do problema que perguntei nesta pergunta . Se eu executar isso:
systemctl disable packagekit
E então, por alguns dias, meu disco permanece estável, mas depois de alguns dias, o PackageKit se reativa e é executado e /var/cache/yum
se enche novamente, atrelando meu disco a 100%.
Não estou perguntando especificamente sobre o PackageKit; realmente estou tentando entender como a desativação do serviço systemd deve funcionar.
Existe alguma maneira de uso geral de dizer: "Desabilite este serviço e também desabilite qualquer maneira de reativá-lo automaticamente?" Ou minha única opção é excluir completamente o pacote que não quero executar?
ATUALIZAÇÃO: Parte da minha pergunta foi equivocada: Não systemctl disable
é trabalho do ' garantir que um serviço nunca seja executado, não importa o quê; tudo systemctl disable
o que faz é dizer que o serviço não deve ser executado automaticamente na inicialização.
Por uma sugestão na resposta do user1686, tentei
busctl --activatable | grep -i packagekit
e pegou
org.freedesktop.PackageKit - - - (activatable) - -
então isso pode indicar que tipo de coisa estava iniciando (se não na inicialização). Mas não pensei em tentar busctl tree
antes de passar para o próximo passo.
Novamente por sugestão de user1686, eu tentei
systemctl mask packagekit
e isso parece ter feito o truque - o que quer que estivesse iniciando aquela coisa antes, não está iniciando mais. Não sei se isso seria considerado uma solução feia, de força bruta ou perigosa; Não sei se vai funcionar para sempre, mas parece estar funcionando por enquanto.
"Desabilitar" um serviço no systemd é basicamente equivalente a "remover do nível de execução" em outros sistemas init (remove o serviço da árvore de dependência 'multi-user.target'). Na maioria das vezes, isso significa que o serviço não será mais iniciado explicitamente durante a inicialização.
Mas isso não significa que o serviço não possa ser iniciado de outras
systemctl start
maneiras – por exemplo, você ainda pode desativar manualmente um serviço, assim como/etc/init.d/foo start
no passado.Alguns serviços são configurados para serem iniciados de maneiras mais indiretas do que simples "na inicialização", mas que ainda podem acionar sua inicialização enquanto o sistema ainda está inicializando:
Eles podem ser iniciados como uma dependência explícita de algum outro serviço. Se esse outro serviço for iniciado na inicialização, este também será iniciado.
Tente
systemctl list-dependencies --reverse <unit>
ver se algo quer ou requer esse serviço.Eles podem ter uma
.socket
unidade associada que iniciará o serviço "sob demanda" assim que um cliente tentar se conectar. (Se houver uma tentativa de conexão durante a inicialização, certamente parecerá que o serviço foi iniciado "na inicialização".)O serviço
systemctl status
deve mostrar se está ativado por uma unidade de soquete ou timer – essas unidades também podem ser interrompidas e desabilitadas.Da mesma forma que a ativação de soquete sob demanda, os serviços podem ser "ativados por D-Bus" por um programa tentando falar com eles através do barramento de mensagens. (Por exemplo, é possível que o packagekitd seja iniciado porque o gnome-software tentou consultá-lo no momento do seu logon.)
Muitas vezes, esses serviços têm um Alias que "systemctl disable" remove, impedindo a ativação indesejada do D-Bus de um serviço desativado - mas isso nem sempre é implementado corretamente. 1
No entanto, além disso, o systemd não ativa automaticamente as unidades que você desativou. Se você ver que uma unidade está explicitamente habilitada novamente (por exemplo, o link simbólico dentro
multi-user.target.wants
foi recriado), então ela deve ter sido acionada por algo externo.Algumas distribuições usam predefinições do systemd para reativar ou reativar unidades de acordo com sua política geral, invocando
systemctl preset
toda vez que algum pacote relevante é atualizado. (Consulte a página de manual systemd.preset .) Se você criar uma predefinição personalizada que diga ao systemctl para sempre desabilitar o serviço, ele substituirá a política da distribuição:Algumas distribuições têm uma chamada direta para
systemctl enable
hardcoded em seus scripts de pós-atualização. Nesse caso, mascarar a unidade faria com que o systemd se comportasse como se não existisse – ele não pode mais ser ativado, iniciado ou tocado de outra forma:O gerenciador de pacotes da sua distribuição também pode ter a opção de pular a extração de certos arquivos completamente, para que eles literalmente não existam mais no que diz respeito ao systemd – por exemplo, pacman:
Ativação do D-Bus
1 Se o seu serviço estiver listado em
busctl --activatable
, tente usar, por exemplo,busctl tree
em seu nome de barramento e veja se isso faz o serviço iniciar.Se falar com org.freedesktop.PackageKit1 (ou qualquer outro nome) fizer com que um serviço systemd desabilitado seja iniciado, isso geralmente significa que o
.service
arquivo D-Bus está apontando para o.service
arquivo systemd errado (sim, são coisas diferentes), ou não apontando para um serviço systemd (fazendo com que o dbus-daemon gere o serviço diretamente).No primeiro caso, você pode mascarar o systemd .service e o dbus-daemon não poderá mais iniciá-lo. Neste último caso, você terá que sobrescrever o D-Bus .service via
/usr/local/share/dbus-1
ou fazer com que seu gerenciador de pacotes não o extraia (já que dbus-daemon não tem um equivalente para habilitar/desabilitar, nem mascarar/desmascarar) .Como eu odeio quando coisas assim acontecem, eu desinstalo o aplicativo e destruo a mídia de instalação para que não possa ser reinstalado.
De jeito nenhum eu vou manter aplicativos que não me dizem tudo o que eles fazem, eles podem incluir a instalação de outras coisas desconhecidas, como trojans ou um backdoor, em seu sistema que eles também não mencionam.
Eu o desinstalaria para garantir que eles não pudessem fazer uma atualização para anular sua solução alternativa. Quando o aplicativo não existe, as atualizações também não.