É bem claro pela experimentação que rsync
se comporta como outras ferramentas como ping
e não herda sinais do pai Bash chamador.
Então você tem que ter um pouco de criatividade com isso e fazer algo como o seguinte:
$ cat rsync.bash
#!/bin/sh
set -m
trap '' SIGINT SIGTERM EXIT
rsync -avz LargeTestFile.500M [email protected]:/tmp/. &
wait
echo FIN
Agora, quando eu executo:
$ ./rsync.bash
X11 forwarding request failed
building file list ... done
LargeTestFile.500M
^C^C^C^C^C^C^C^C^C^C
sent 509984 bytes received 42 bytes 92732.00 bytes/sec
total size is 524288000 speedup is 1027.96
FIN
E podemos ver que o arquivo foi totalmente transferido:
$ ll -h | grep Large
-rw-------. 1 501 games 500M Jul 9 21:44 LargeTestFile.500M
Como funciona
O truque aqui é que estamos informando ao Bash via set -m
para desativar os controles de trabalho em quaisquer trabalhos em segundo plano dentro dele. Em seguida, estamos fazendo o background rsync
e, em seguida, executando o comando wait
, que aguardará no último comando de execução, rsync
, até que esteja concluído.
Em seguida, guardamos todo o script com o trap '' SIGINT SIGTERM EXIT
.