我有一个运行多个rsync命令的脚本。当我按ctrl + c时,只有正在运行的rsync命令停止,然后脚本中的下一个启动。终止整个bash脚本而不是子进程
如何更改脚本,以便ctrl + c将停止整个过程而不是仅仅一个命令?
现在脚本中没有任何逻辑,只是依次对不同文件夹进行rsyncing。
对于具有示例起见,我们假设它是
#!/bin/bash
rsync -artv foo/ bar/
rsync -artv another/ folder/
我有一个运行多个rsync命令的脚本。当我按ctrl + c时,只有正在运行的rsync命令停止,然后脚本中的下一个启动。终止整个bash脚本而不是子进程
如何更改脚本,以便ctrl + c将停止整个过程而不是仅仅一个命令?
现在脚本中没有任何逻辑,只是依次对不同文件夹进行rsyncing。
对于具有示例起见,我们假设它是
#!/bin/bash
rsync -artv foo/ bar/
rsync -artv another/ folder/
不幸的是,它有点难看。为了确保当你点击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中处理信号的乐趣之一。
最简单的方法是添加:
trap 'exit' INT
在脚本的开始。
这将在捕获ctrl + c组合后执行exit
,并完全停止脚本的执行。
[This](http://mywiki.wooledge.org/SignalTrap#Special_Note_On_SIGINT)页面指示脚本应该在SIGINT/Ctrl-C上死亡,如果rsync表现良好的话。我想假定rsync表现良好(尽管可能不是)。 –