2015-06-28 29 views
1

我有一个运行多个rsync命令的脚本。当我按ctrl + c时,只有正在运行的rsync命令停止,然后脚本中的下一个启动。终止整个bash脚本而不是子进程

如何更改脚本,以便ctrl + c将停止整个过程而不是仅仅一个命令?

现在脚本中没有任何逻辑,只是依次对不同文件夹进行rsyncing。

对于具有示例起见,我们假设它是

#!/bin/bash 
rsync -artv foo/ bar/ 
rsync -artv another/ folder/ 
+0

[This](http://mywiki.wooledge.org/SignalTrap#Special_Note_On_SIGINT)页面指示脚本应该在SIGINT/Ctrl-C上死亡,如果rsync表现良好的话。我想假定rsync表现良好(尽管可能不是)。 –

回答

1

不幸的是,它有点难看。为了确保当你点击ctrl-c时bash获得了SIGINT,你不能让rsync在前台运行。相反,你需要做的是这样的:

#!/bin/bash 

trap 'kill $!; exit 1;' INT 
rsync -artv foo/ bar/ & 
wait 
rsync -artv another/ folder/ & 
wait 

但是,这并不很你想要什么,因为这将SIGTERM而不是SIGINT到rsync的。不幸的是,因为rsync是异步运行的(即在后台运行),bash将忽略SIGINT来启动它,所以你不能依赖转发SIGINT。 (这是很可能的,rsync的将它的信号处理接受SIGINT,但一般用这种方法,你应该假设正在运行的作业忽略SIGINT)

的主要问题是,如果rsync的是在前台运行那么bash不会看到SIGINT,除非您在一个rsync完成之后并在下一个启动之前发送它。通过在后台运行作业,bash会看到信号。

请注意,这并不稳健;这是在* nix中处理信号的乐趣之一。

1

最简单的方法是添加:

trap 'exit' INT 

在脚本的开始。

这将在捕获ctrl + c组合后执行exit,并完全停止脚本的执行。