Interromper a execução de loop após a iteração atual

3

Eu freqüentemente executo programas que demoram muito em vários servidores remotos:

for NUM in {1..100}; do ssh host-{NUM}.mydomain.com /usr/bin/takesalongtime; done

Na maior parte do tempo, deixo isso acontecer em segundo plano (ou seja, em um emulador de terminal enquanto faço outra coisa) e aguardo a conclusão. No entanto, às vezes preciso interromper o loop e continuar ou executá-lo novamente mais tarde.

Existe uma maneira de impedir que um loop seja executado em uma festa interativa após a iteração atual sem matar o atual programa ssh ou takesalongtime no processo?

Ou seja. Eu quero fazer algo, para que o loop se comporte como eu inseri um break; entre o comando ssh e done , para que ele quebra o loop depois de completar takesalongtime no host remoto atual.

    
por Richard Neumann 05.09.2017 / 14:33

1 resposta

2

Encontre o pid do shell e envie um sigint. Isso não irá parar o ssh, mas quando terminar o shell irá lidar com o sinal e finalizar o loop.

$ for i in {1..100}; do ssh -n localhost 'sleep 9;date'; done

no outro terminal

$ ps fax
10636 ?        S      0:00          |   \_ xterm
10638 pts/2    Ss     0:00          |       \_ bash
12164 pts/2    S+     0:00          |           \_ ssh -n localhost sleep 9;date
$ kill -int 10638

Se você usou o comando em segundo plano adicionando & ao final, poderá usar kill -hup no shell em segundo plano.

    
por 05.09.2017 / 14:45

Tags