Context:
我有一个 bash 脚本,其中包含一个子 shell 和一个用于 EXIT 伪信号的陷阱,并且它在执行期间没有正确捕获中断rsync
。这是一个例子:
#!/bin/bash
logfile=/path/to/file;
directory1=/path/to/dir
directory2=/path/to/dir
cleanup () {
echo "Cleaning up!"
#do stuff
trap - EXIT
}
trap '{
(cleanup;) | 2>&1 tee -a $logfile
}' EXIT
(
#main script logic, including the following lines:
(exec sleep 10;);
(exec rsync --progress -av --delete $directory1 /var/tmp/$directory2;);
) | 2>&1 tee -a $logfile
trap - EXIT #just in case cleanup isn't called for some reason
该脚本的想法是这样的:大多数重要的逻辑都在子 shell 中运行,该子 shell 通过管道传输tee
并记录到日志文件中,所以我不必tee
主逻辑的每一行都将其全部记录下来。每当子 shell 结束或脚本因任何原因停止时(EXIT 伪信号应该捕获所有这些情况),陷阱将拦截它并运行cleanup()
功能,然后移除陷阱。这rsync
and sleep
命令(睡眠只是一个例子)运行exec
如果我在运行时杀死父脚本,则可以防止创建僵尸进程,并且每个可能长时间运行的命令都包含在其自己的子 shell 中,以便当exec
完成后,它不会终止整个脚本。
问题:
如果我中断脚本(通过kill
或 CTRL+C) 在 exec/subshell 包装期间sleep
命令,陷阱工作正常,我看到“正在清理!”回显并记录。如果我在执行过程中中断脚本rsync
命令,我明白了rsync
结束,并写下rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [sender=3.0.6]
到屏幕上,然后脚本就消失了;无需清理,无需捕获。为什么不打断/杀死rsync
触发陷阱?
我尝试过使用--no-detach
用rsync切换,但没有改变任何东西。
我有 bash 4.1.2、rsync 3.0.6、centOS 6.2。
如何将 X 点的所有输出重定向到 tee,而不必在各处重复它并弄乱所有子 shell 和执行器......(希望我没有错过任何东西)
#!/bin/bash
logfile=/path/to/file;
directory1=/path/to/dir
directory2=/path/to/dir
exec > >(exec tee -a $logfile) 2>&1
cleanup () {
echo "Cleaning up!"
#do stuff
trap - EXIT
}
trap cleanup EXIT
sleep 10
rsync --progress -av --delete $directory1 /var/tmp/$directory2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)