4

请考虑这个 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 源代码并了解陷阱的工作原理......

4

2 回答 2

4

您是否尝试过按照 SO 问题中的建议使用rsyncwith在subshel​​l/exec 语句期间不捕获中断--no-detachbashrsync

于 2012-11-26T22:15:39.110 回答
3

从实验中可以清楚地看出,它的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

这个怎么运作

这里的诀窍是我们告诉 Bash viaset -m禁用其中任何后台作业的作业控制。然后我们在后台rsync运行一个wait命令,该命令将等待最后一个运行命令rsync,直到它完成。

然后我们用trap '' SIGINT SIGTERM EXIT.

参考

于 2018-07-10T01:48:46.310 回答