微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 在rsync / subshel​​l exec语句中,Bash没有捕获中断

语境:

我有一个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中,通过tee和日志文件进行管道传输,所以我没有必须通过主逻辑的每一行来完成所有记录.每当子shell结束,或脚本因任何原因停止(EXIT伪信号应捕获所有这些情况),陷阱将拦截它并运行cleanup()函数,然后删除陷阱. rsync和sleep命令(睡眠只是一个例子)是通过exec运行的,以防止在我们运行时杀死父脚本时创建僵尸进程,并且每个可能长时间运行的命令都包含在它自己的子shell中这样当exec完成时,它不会终止整个脚本.

问题:

如果我在exec / subshel​​l wrapped sleep命令期间中断脚本(通过kill或CTRL C),则陷阱正常工作,我看到“正在清理!”回应并记录.如果我在rsync命令期间中断脚本,我看到rsync结束,并写入rsync错误:在rsync.c(544)[sender = 3.0.6]接收到SIGINT,SIGTERM或SIGHUP(代码20)到屏幕,然后剧本就死了;没有清理,没有陷阱.为什么不中断/杀死rsync会触发陷阱?

我尝试过使用带有rsync的–no-detach开关,但它没有改变任何东西.
我有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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐