Script Bash para aguardar o término de um processo em vários servidores [duplicado]

2

Eu queria ssh para vários servidores remotamente e verificar se há processos em execução nesses servidores e esperar até que o processo seja concluído. Eu escrevi o código abaixo, mas isso verifica apenas o primeiro ip no arquivo (ip.txt) desde que eu adicionei a instrução 'continue'. Alguém pode me ajudar a modificar este código?

  while read IP
  do
    ssh ubuntu@$IP "pgrep -f pattern"
    if [ $? -eq 0 ]; then
       echo "Process is running" 
       sleep 10
       continue
    else
       echo "Process is not running"
    fi
  done < ip.txt

Qualquer ajuda seria apreciada. Obrigado!

    
por Nani 22.02.2018 / 18:49

3 respostas

0

Talvez seja melhor ter sua lista de IPs em primeiro lugar e, depois, iterar sobre ela:

mapfile ipaddresses < ip.txt
canary=alive
while [[ "alive" == "$canary" ]]; do
  canary=dead
  for ip in ${ipaddresses[@]}; do
    if ssh ubuntu@$ip "pgrep -f pattern"; then
      echo "Process is running on $ip"
      canary=alive
      sleep 10
      continue
    else
      echo "Process not running on $ip"
    fi
  done
done

Se você ainda estiver preso em uma versão de bash abaixo de 4, substitua o comando mapfile por:

read -r ipaddresses <<< "$( cat ip.txt )"
    
por 22.02.2018 / 19:18
0

Eu vejo alguns problemas com o fluxo básico do programa aqui. Onde você tem uma construção aqui, há realmente algumas coisas sendo rastreadas:

  1. Se algum dos hosts da sua lista ainda tiver um processo em execução nessa verificação, devemos registrá-lo e verificar novamente
  2. Se o número de hosts que ainda têm um processo for 0, devemos sair.

Então, eu usaria dois loops para esse script. Além disso, continue não deve ser necessário aqui, e provavelmente é isso que está causando a repetição do primeiro host a cada vez.

Eu fiz algumas coisas de forma diferente, principalmente testando o número de PIDs retornados de psget em vez de verificar o código de saída ssh e usando uma sintaxe ligeiramente diferente. Aqui está o exemplo que eu criei que parece funcionar para o que você quer:

#!/bin/bash
set -eu

# get number of IPs from lines in file
NUM_IPS=$( cat ip.txt | wc -l )
echo "checking ${NUM_IPS} hosts..."

# Set number of running hosts to the max.  While arbitrary, it will 
# update to the correct number before reporting, and if it is 0 the
# while loop will exit immediately.
IPS_STILL_RUNNING=${NUM_IPS}

while [ "${IPS_STILL_RUNNING}" -gt "0" ]
do
    RUNNING_NOW=0
    for IP in $( cat ip.txt )
    do
        PROC_NUM=$( ssh ${IP} -- pgrep -f pattern | wc -l )
        if [ "${PROC_NUM}" -gt "0" ]; then
            echo "  ${IP}: still running"
            RUNNING_NOW=$(( RUNNING_NOW + 1 ))
        else
            echo "  ${IP}: not running"
        fi
    done
    echo "still running on $RUNNING_NOW hosts"
    IPS_STILL_RUNNING=${RUNNING_NOW}
    sleep 10
done
    
por 22.02.2018 / 22:22
0

Se você quiser ssh para vários hosts em paralelo, use um programa como pdsh (Parallel Distributed Shell).

Por exemplo, se seu ip.txt contiver endereços IP em vez de nomes de host ou uma combinação de nomes de host & Endereços IP:

hosts="$(awk '{l = l","$0}; END {sub(/^,/,"",l); print l}' ip.txt)"
while pdsh -l ubuntu -w "$hosts" 'pgrep -f pattern' 2>/dev/null | 
        grep pattern ; do
  sleep 10
done

Isso usa awk para criar uma lista de endereços IP separados por vírgulas para se conectar com ssh .

Se o arquivo ip.txt contiver nomes de host somente em vez de endereços IP, é muito mais simples:

while pdsh -l ubuntu -F ./ip.txt -a 'pgrep -f pattern' 2>/dev/null | 
        grep pattern ; do
  sleep 10
done

Ambos pressupõem que ip.txt tenha um endereço IP ou nome de host por linha.

O loop while é executado até que nenhum dos hosts produza qualquer saída que corresponda ao padrão. stderr do comando pdsh é redirecionado para / dev / null para evitar spam no terminal com mensagens de erro quando o comando pgrep retorna o código de saída 1 para pdsh .

A única saída é do grep pattern no pipeline. Use grep -q pattern se você quiser isso silenciado também.

    
por 22.02.2018 / 22:35