请考虑这个bash脚本:
#!/bin/bash
trap '' INT
echo sleep:
sleep 5
echo rsync:
rsync -a /usr/lib /var/tmp
尝试使用ctrl-c中断睡眠失败,正如预期的那样。但rsync是可中断的(睡眠和rsync的顺序无关紧要)?欢迎任何想法!
编辑: 发现一个区别:rsync本身启动2个子进程(客户端/服务器,产生2个错误消息,我假设),这些似乎不会继承其父进程的“无知”。必须深入了解bash来源并找出陷阱是如何工作的......
答案 0 :(得分:4)
您是否尝试使用rsync
与--no-detach
建议使用bash
not trapping interrupts during rsync
subshell/exec statements中的{{1}}建议?
答案 1 :(得分:1)
从实验中可以很明显地看出,rsync
的行为类似于ping
之类的其他工具,并且不会继承来自调用Bash父对象的信号。
因此您必须对此有所创意,并执行以下操作:
$ cat rsync.bash
#!/bin/sh
set -m
trap '' SIGINT SIGTERM EXIT
rsync -avz LargeTestFile.500M root@host.mydom.com:/tmp/. &
wait
echo FIN
现在,当我运行它时:
$ ./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
我们可以看到文件已完全传输:
$ ll -h | grep Large
-rw-------. 1 501 games 500M Jul 9 21:44 LargeTestFile.500M
这里的窍门是我们通过set -m
告诉Bash禁用其中的任何后台作业的作业控制。然后,我们将rsync
设为背景,然后运行一个wait
命令,该命令将等待最后一个运行的命令rsync
,直到完成。
然后,我们使用trap '' SIGINT SIGTERM EXIT
保护整个脚本。