Estou sincronizando novamente alguns diretórios. Eu tenho um terminal bash aberto e estou executando algo assim:
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done
Porém, se eu quiser parar tudo, pressiono Control-C. Isso interrompe o rsync, mas continua para o próximo. Neste caso eu percebo o que aconteceu e então apenas pressiono Control-C como um louco até que as coisas funcionem novamente.
Existe alguma maneira de 'consertar' isso. Eu quero que se eu tiver um loop como esse e pressionar Control-C, ele me retornará ao meu shell bash.
Responder1
for DIR in * ; do rsync -a $DIR example.com:somewhere/ || break; done
Isso também sairá do loop se uma execução individual do rsync falhar por algum motivo.
Responder2
Para expandir a resposta de Dennis, seu código pode ser parecido com:
trap "echo Exited!; exit;" SIGINT SIGTERM
Para um exemplo prático (que envolve rsync), confirahttp://gist.github.com/279849.
Responder3
Você pode definir uma armadilha para Control-C.
trap <command> SIGINT
executará o command
quando Control-C for pressionado. Basta colocar a trap
declaração em algum lugar do seu roteiro, no ponto em que você deseja que ela se torne eficaz.
Responder4
Quando você coloca uma sequência de comandos entre parênteses, a sequência atuará como um processo único, receberá o SIGINT e terminará quando você pressionar Ctrl- C:
(for DIR in * ; do rsync -a "$DIR" example.com:somewhere/ ; done)
Mas! No caso do rsync
comando, ele permite múltiplas fontes, então o código que você escreveu seria melhor escrito como:
rsync -a * example.com:somewhere/