Execute um comando paralelo enquanto aguarda o ssh

3

Eu preciso usar o ssh em um servidor e verificar se há um serviço para ver se ele está ativo e em execução. O que eu faço é usar o comando ssh e executar um comando que chame esse serviço e verifique a saída desse comando. Eu quero ter uma barra de progresso para mostrar ao usuário que o script está tentando verificar o status do serviço; mas não consigo executar a função da barra de progresso enquanto o comando ssh não é retornado do servidor! (o ssh deve esperar que o serviço inicie completamente antes que possa verificar o status) e eu sinto falta dessa parte do progresso.

Existe uma maneira padrão de lidar com esse cenário?

Meu comando ssh é algo assim:

State=$(ssh host "app-status")

E isso deve retornar algo como:

Status OK
    
por coffeMug 06.02.2014 / 10:13

3 respostas

5

Você pode executar ssh em segundo plano e gravar sua saída em um FIFO

#! /bin/bash
mkfifo fifo-ssh
(ssh host "app-status"; echo error;) >fifo-ssh &
exec 3<>fifo-ssh
until read -t 1 -u 3 status; do
  echo -n .
done
# if [ "$status" = error ]; then...
    
por 06.02.2014 / 10:51
5

Alternativa para o Hauke, que não envolve a criação de um pipe nomeado (e o incômodo associado ao acesso exclusivo, limpeza ... dele), que preserva o status de saída e suporta saída de várias linhas:

result=$(
  {
    {
      ssh host app-status >&3 3>&-; echo "$?"
    } | {
      until read -t1 ret; do
        printf . >&2
      done
      exit "$ret"
    }
  } 3>&1
)

deve funcionar em zsh , ksh93 e bash ( $status é especial (um alias para $? ) em zsh , como em (t)csh ).

Acima, temos um subshell ( { ssh ...; echo "$?"; } ) cuja saída vai para o loop until . Nada é produzido por essa sub-rotina, exceto o $? quando ssh retorna. A saída ssh em si vai para $result por meio do descritor de arquivo 3, que fizemos para apontar para o canal que alimenta a substituição do comando.

Portanto, enquanto ssh estiver em execução, o read -t1 expirará e, assim que ssh retornar, read lerá o status de saída e concluirá o loop.

Explicação mais detalhada em esta pergunta que é um acompanhamento sobre este assunto.

    
por 06.02.2014 / 11:58
0

Descobri que é muito mais simples executar a barra de progresso em segundo plano em vez do comando ssh. Algo parecido com isto:

function progress {
while :
do
    sleep 1
    echo -e ".\c"
done
}

progress &

PROGRESS_PID=$!

ssh_command_runs_here

status_check_command_here

kill -9 $PROGRESS_PID
    
por 06.02.2014 / 21:04

Tags