systemd: parar todas as unidades desinstaladas

1

Eu tenho algumas unidades do systemd instaladas e em execução. Digamos que eu desinstale manualmente o foo.service por

  • removendo seus arquivos .service (e .socket)
  • removendo todos os links simbólicos (por exemplo, de default.target.wants /)

Eu posso executar systemctl daemon-reload e, em seguida, vejo:

# systemctl status foo.service
foo.service
   Loaded: error (Reason: No such file or directory)
   Active: active (running) since Mon 2013-07-08 13:50:29 EST; 48s ago
 Main PID: 1642 (node)

Então o systemd sabe que não está instalado e que está sendo executado. Existe algum comando que eu possa usar para interromper todos os serviços em execução que não possuem mais um arquivo de unidade?

Coisas que já considerei:

  • systemctl isolate <current-target>

    Isso teria o efeito colateral de interromper outros serviços iniciados manualmente que não são exigidos pelo destino atual.

  • Use systemctl disable em vez de remover arquivos manualmente

    Eu gostaria, mas esse script pode ser executado em uma máquina host com acesso ao sistema de arquivos de um contêiner em execução - ele não pode chamar systemd diretamente.

  • Use systemctl stop foo.service

    Isso implica que eu sei quais serviços foram desinstalados. Eu não quero ter que descobrir isso (ou lembrar), eu quero um comando geral que pode ser executado a qualquer momento para interromper quaisquer serviços remanescentes.

por gfxmonk 08.07.2013 / 06:27

1 resposta

3

Eu perguntei para a lista de discussão e Lennart Poettering respondeu com o seguinte conselho:

link

Citando aqui a posteridade:

Portanto, a maneira correta de lidar com isso é garantir que os pacotes pergunta contém os scriplets certas que terminam todas as unidades que incluir antes da desinstalação. Claro, sempre vai estar quebrado pacotes como este eu temo, portanto, eu posso ver totalmente o seu usecase.

Atualmente, não há uma maneira legal de lidar com isso, mas o que você pode fazer é:

$ systemctl --all --type=not-found --type=error

Isso listará todas as unidades em que o estado de carregamento é "erro" ou "não encontrado" (note que "não encontrado" só está disponível em muito recente versões, e em versões mais antigas do systemd era apenas um caso especial de 'erro'. A linha de comando acima funciona para todas as versões). O --type = switch é usado para filtrar tipos de unidades, mas na verdade também pode ser usado para filtrar para o estado de carga.

Em seguida, filtre a primeira coluna:

$ systemctl --no-legend --all --type=not-found --type=error | awk '{ print $1 }'

Isso fornecerá uma lista de arquivos de unidade que foram referenciados ou iniciados mas não tem arquivo de unidade instalado. Então use isso para parar as unidades:

$ systemctl stop 'systemctl --no-legend -all --type=not-found --type=error | awk '{ print $1}''
    
por 19.07.2013 / 01:53

Tags