Posso reiniciar o systemd sem reiniciar?

39

Estou tentando reiniciar os serviços após um yum updateno RHEL 7.4. Eu poderia reiniciar todos os serviços usando systemctl, mas needs-restartingfrom yum utilsme diz que eu também deveria reiniciar o systemd:

# needs-restarting
1 : /usr/lib/systemd/systemd --system --deserialize 21

Posso reiniciar systemdsem reiniciar o servidor e como?

Encontrei algumas menções systemctl daemon-reload, mas isso não faz com que desapareça da lista de reinicializações de necessidades.

Benjamin
fonte

Respostas:

43

Para reiniciar o daemon, execute

systemctl daemon-reexec

Isso está documentado na página de systemctlmanual :

Execute novamente o gerenciador do systemd. Isso serializa o estado do gerente, reexecuta o processo e desserializa o estado novamente. Este comando é de pouca utilidade, exceto para depuração e atualizações de pacotes. Às vezes, pode ser útil como um peso pesado daemon-reload. Enquanto o daemon estiver sendo reexecutado, todos os soquetes do sistema que estiverem ouvindo em nome da configuração do usuário permanecerão acessíveis.

Infelizmente, needs-restartingnão é possível determinar que systemdrealmente foi reiniciado. systemd execsreiniciar, o que não redefine a hora de início do processo; mas needs-restartingcompara o tempo de modificação do executável com o horário de início do processo para determinar se um processo precisa ser reiniciado (entre outras coisas) e, como resultado, ele sempre considera que systemdprecisa ser reiniciado ... Para determinar se systemdrealmente precisa ser reiniciado, você pode verificar a saída de lsof -p1 | grep deleted: systemduses a library, libsystemd-sharedque é enviada no mesmo pacote e, portanto, é atualizada juntamente com o daemon; portanto, se systemdprecisar ser reiniciado, você a verá usando uma versão excluída da biblioteca. Se lsofnão mostrar arquivos excluídos, systemdnão precisará ser reiniciado. (Graças aJeff Schaller pela dica!)

Stephen Kitt
fonte
1
@Raman, daemon-reexecé suposto para trabalhar mesmo com systemdcomo pid 1.
Stephen Kitt
3
O ponto crucial da reinicialização das necessidades se resume a github.com/rpm-software-management/yum/blob/master/…, onde consulta o "start_time" do PID; se o daemon-reexec não atualizar isso, o needs-restarting permanecerá "confuso".
Jeff Schaller
1
Não assuma que qualquer caminho de código envolvido seja bem testado, especialmente em sistemas que não sejam do RedHat. É tecnicamente possível executar o daemon-reexec, mas é mais seguro reiniciar.
Harald
2
@ Harald é usado sempre que alguém atualiza o systemdDebian e derivados, por isso é bem testado. Também é razoavelmente simples (procure do_reexecute).
Stephen Kitt
1
@StephenKitt - Quando tento executar lsof -p1 | grep deleteda seguinte saída é gerada lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete. Na leitura ( unix.stackexchange.com/questions/171519/… ), parece que mesmo o root não consegue acessá-lo. Qual seria a alternativa lsof -p1 | grep deleted?
Motivado
3

No meu caso, eu tinha acabado de atualizar systemde qualquer systemctlcomando estava falhando:

# systemctl daemon-reexec
Failed to reload daemon: Access denied
# systemctl status
Failed to read server status: Access denied

No entanto, de acordo com a página de initmanual, você pode fazer o mesmo enviando SIGTERMpara o daemon em execução como o PID 1, que funcionou:

kill -TERM 1

Isso recarregou o daemon, após o qual todos os systemctlcomandos começaram a funcionar novamente.

Malvineous
fonte