Múltiplas instâncias

1

Atualmente, estou trabalhando em um script pequeno no qual preciso atualizar um arquivo em vários servidores, tenho uma longa lista de IPs dos meus servidores e, atualmente, estou usando ncftpput para adicionar os arquivos aos servidores em um. um tempo.

Não consigo descobrir como iniciar ncftpput com o próximo endereço IP da minha lista para que eu possa ter várias atualizações em execução ao mesmo tempo.

Minha lista é apenas endereços IP:

192.168.0.1
192.168.0.2
192.168.0.3
......
until 192.168.0.150

O que eu preciso é o primeiro ncftpput para acessar o primeiro IP, o segundo número dois IP e assim por diante para a quantidade de threads que eu preciso / sistema pode manipular.

Digamos que 10 de cada vez e quando o primeiro segmento termina leva apenas o próximo IP NÃO tomado por nenhum dos outros threads.

Espero ter esclarecido meu problema e que alguém possa me ajudar a descobrir isso.

Até agora eu estou fazendo assim: (executando um de cada vez)

while read ip; do
    ncftpput -c -A -u "$USER" -p "$PASSWD" "$ip" "/usr/local/program/program.conf" < "~/addthisinfo" 2>/dev/null
    if [ $? -eq 0 ]
        then
            echo -e "Here goes my succes test" >>/tmp/text_added
        else
            echo "$ip failed ! please take care of this"
    fi  
done <"$pathtoiplist""/iplist"

Eu tenho tentado com algumas das respostas que encontrei na net, mas não consigo enxergar a saída. Eu continuo terminando com uma nova instância de ncftpput ou vários começando do topo do meu arquivo e não do próximo endereço IP na lista.

    
por Michael Bay Laursen 28.07.2016 / 22:45

2 respostas

1

Basta colocar um caractere & no final do comando ncftpput para executá-lo em segundo plano e retornar o controle de volta ao script imediatamente, assim:

ncftpput [...] < "~/addthisinfo" 2>/dev/null &

Eu omiti a longa lista de opções que você tinha, não esqueça de adicioná-las de volta em vez de [...]

    
por Byte Commander 28.07.2016 / 22:59
0

Com base na resposta do Byte Commander , sugiro

while read ip
do
    (
    ncftpput -c -A -u "$USER" -p "$PASSWD" "$ip" "/usr/local/program/program.conf" < "~/addthisinfo"
    if [ "$?" -eq 0 ]
        then
            echo "Here goes my success test" >>/tmp/text_added
        else
            echo "$ip failed ! please take care of this"
    fi
    ) &
done < "$pathtoiplist/iplist" 2>/dev/null

Notas:

  • Isso gera uma subshell assíncrona (em segundo plano) para cada endereço IP no seu iplist . Isso permite que o shell detecte e registre a falha de qualquer ncftpput instância (processo).
  • Você fez um bom trabalho citando suas referências de variáveis de shell (por exemplo, "$ip" e "$pathtoiplist" ). Mas você também deve citar "$?" . Estritamente falando, você não precisa citar cadeias de caracteres simples e constantes como "/usr/local/program/program.conf" . Mas não faz mal.
  • Não tenho certeza se você realmente quer o echo para cada invocação bem sucedida, e eu especialmente não sei porque você quer fazer isso com echo -e (quando o texto da mensagem não contém barras invertidas).
  • Você pode querer enviar as mensagens de erro (falha) para um arquivo. Como os processos estão sendo executados de forma assíncrona, talvez você queira gravar arquivos de erro separados para evitar colisões; por exemplo.,
     echo "$ip failed ! please take care of this" > "/tmp/$ip.error"
  • Mudei o 2>/dev/null do comando ncftpput para o loop (a linha done ) para simplificar. Note que você não pode fazer isso com o < "~/addthisinfo" , já que você precisa de cada instância para ler o arquivo de forma independente.
  • Alterei "$pathtoiplist""/iplist" para "$pathtoiplist/iplist" . Isso é seguro desde que o primeiro caractere após o nome da variável ( / , neste caso) é aquele que não é permitido em nomes de variáveis. Eu fiz a mesma coisa com "/tmp/$ip.error" , acima.
por G-Man 29.07.2016 / 05:47