Desligar máquina via SSH não retorna valor de saída

2

Tivemos uma versão antiga do Ubuntu (12.04) que usava o sysV. Devido a LTS ficar sem ele, precisávamos mudar para 16.04.

Uma das principais mudanças foi a mudança do SysV para o systemd. Percebemos que, quando fizemos essa alteração, todo o nosso código que fazia qualquer tipo de ssh root@thisismyhostname "shutdown -h now" seria interrompido, quando anteriormente ele iniciava o desligamento, retornava EXIT_SUCCESS e fechava a conexão. Com o systemd, no entanto, parece que as conexões permaneceram abertas. Eu encontrei a correção para isso, que era que precisávamos instalar e habilitar o PAM e tinha que mudar de shutdown -h now para systemctl poweroff para que o systemd iterasse pelas conexões e as fechasse antes de desligar, a funcionalidade que queremos.

O problema que agora acontece é que provavelmente 1/20 do tempo, parece haver uma condição de corrida que acontece quando o desligamento recebe CPU suficiente para derrubar o sistema, o que faz com que o SSH retorne 255 (o código de retorno para conexão fechada) em vez de retornar EXIT_SUCCESS para o comando de desligamento executado a partir do SSH.

Nós (infelizmente) temos mais de um lugar no código que chama shutdown, e eu sinto que verificar se EXIT_SUCCESS ou 255 da SSH é uma solução alternativa hacky. Alguém sabe de uma maneira de obter o Ubuntu 16.04 com systemd para retornar EXIT_SUCCESS depois de chamar systemctl poweroff ?

    
por clamport 12.10.2016 / 21:47

1 resposta

0

Considere usar a capacidade de systemctl de enviar seus próprios comandos via ssh para hosts remotos.

Da página do manual:

       -H, --host=
           Execute the operation remotely. Specify a hostname, or a username
           and hostname separated by "@", to connect to. The hostname may
           optionally be suffixed by a container name, separated by ":", which
           connects directly to a specific container on the specified host.
           This will use SSH to talk to the remote machine manager instance.
           Container names may be enumerated with machinectl -H HOST.

Funciona muito assim:

# ssh-copy-id -i ~/.ssh/id_ed25519.pub 172.25.50.100

...

# systemctl -H 172.25.50.100 status
● 172.25.50.100
    State: degraded
     Jobs: 0 queued
   Failed: 1 units
    Since: Thu 2017-03-02 01:56:07 EST; 17h ago
   CGroup: /
# systemctl -H 172.25.50.100 poweroff
# echo $?
0
    
por 03.03.2017 / 01:23