bash trap不会忽略信号

时间:2012-11-26 18:13:43

标签: bash signals rsync bash-trap

请考虑这个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来源并找出陷阱是如何工作的......

2 个答案:

答案 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保护整个脚本。

参考文献