Bash 在 rsync/subshel​​l exec 语句期间不捕获中断

2023-11-25

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/subshel​​l 包装期间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(使用前将#替换为@)

Bash 在 rsync/subshel​​l exec 语句期间不捕获中断 的相关文章

  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 在 bash 脚本中使用源时出现“源:未找到”错误

    我正在尝试编写 我认为的 一个简单的 bash 脚本 它将 运行 virtualenv 以 1 美元创建一个新环境 激活虚拟环境 做更多的事情 安装 django 将 django admin py 添加到 virtualenv 的路径等
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • Bash for Windows 10 gcc 不会编译粘贴到根目录中的 c 文件

    正如标题所示 如果我将在其他地方编写的c文件粘贴到Linux子系统的根目录中 则无法编译它 我做了一个测试 我制作了两个不同标题的 hello world 程序 一个在 vi 中 我可以从 bash 界面进入 另一个在其他地方 当我编译了
  • Django管理命令是在单独的进程中执行的吗?

    Django 有很多管理命令 此外 我们还可以编写自己的命令 进行 shell 调用后会发生什么python manage py XXX 代码是否会在从 shell 启动的进程中执行 或者 shell 进程只是与执行命令的主 Django
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用非规范地址检索内存数据会导致 SIGSEGV 而不是 SIGBUS

    我无法使用以下汇编代码产生 总线错误 这里我使用的内存地址不是合法的 规范地址 那么 我怎样才能触发该错误呢 我在带有 NASM 2 14 02 的 Ubuntu 20 04 LTS 下运行这段代码 但它会导致负载出现 SIGSEGV 分段
  • bash 脚本抱怨文件名太长

    所以我有一个脚本可以执行此操作 jq 是命令行 JSON 处理器 echo Getting LB Node IDs echo LB STATUS jq loadBalancer nodes id 最后一行的输出是 1 2 3 但是当我尝试将
  • 如何正确使用fork、exec、wait

    我正在编写的 shell 需要执行用户提供给它的程序 这是我的程序的非常简短的简化版本 int main pid t pid getpid this is the parents pid char user input NULL size
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • Bash 实例未嵌套在 Dockerfile `RUN` 中

    嵌套 bash 实例会递增 SLVL 环境变量 http tldp org LDP abs html internalvariables html http tldp org LDP abs html internalvariables h
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • SVN 提交后挂钩在提交后不会运行

    我的服务器上设置了 SVN 存储库 并且遇到提交后问题 我在 iMac 上使用 SmartSVN 作为客户端 我通过 SmartSVN 的 ssh svn 连接 我能够成功连接到 SVN 并对其进行更改 但从 SVN 客户端提交后 我的提交
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • Bash:单行命令以与 grep 命令相反的状态退出?

    如何减少以下 bash 脚本 grep P STATUS Perfect recess txt exit 1 exit 0 看起来我应该能够用一个命令来完成它 但我这里总共有 3 个命令 我的程序应该 阅读课间休息 txt 如果它包含 ST
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它

随机推荐

  • 如何将 istream_view 收集到容器中?

    我试图为我的扩展实现一个通用的缩减操作c 20 s ranges这将收集任何元素range到给定的容器中 为了实现这一点 我首先创建了一个虚拟类型来提取template template参数并提供operator 用于梳理一个range用它
  • 如何处理 URL 中的转义字符(管道 |)(Spring、REST、CXF)?

    我正在使用 Spring CXF Tomcat 来开发 Web 服务 我在发送 URL 中的管道 等字符时遇到问题 例如 http localhost 9080 address v1 countries 抛出 500 错误 有没有办法处理它
  • Playstore 错误:App Bundle 包含本机代码,并且您尚未上传调试符号

    当我想向 Playstore 发布新的 flutter 应用程序包时 我收到此错误 此应用程序包包含本机代码 并且您尚未上传调试符号 我们建议您上传符号文件 以使崩溃和 ANR 更易于分析和调试 我找不到任何方法来解决这个问题 我是颤振和发
  • 为什么 ObservableCollection 不支持批量更改?

    造成的潜在问题有哪些ObservableCollection支持操作 例如AddRange or RemoveRange 既然 ObservableCollection 如此频繁地与 WPF 一起使用 那么 Microsoft 不提供它们肯
  • 为什么 Perl 不支持双引号中的哈希插值?

    usr bin perl use warnings my hash no1 gt 1 no2 gt 2 print hash Prints no11no22 print hash Prints hash 为什么 Perl 不支持双引号内的哈
  • Dc.js 将范围图应用于多个图表

    过去几周我一直在使用 dc js 但有一个问题我似乎无法解决 我希望能够使用画笔过滤器基于单个图表更改四个不同图表的比例 大致如下 priorityTotChart width 2 w 3 height h 3 margins top 10
  • 检查交叉投射是否可行?

    我知道使用是合法的dynamic cast跨类层次结构进行 交叉转换 例如 如果我有如下所示的类 A B C 如果我有一个A 指向类型对象的指针C 那么我可以使用 A aPtr something that produces a C B b
  • 如何将 Wbmp 转换为 Png?

    在 Google 上花了很多时间研究这个问题后 我找不到在 C 中将 Wbmp 图像转换为 Png 格式的示例 我从互联网上下载了一些 Wbmp 图像 并使用二进制编辑器查看它们 有没有人有一种算法可以帮助我这样做 或者任何代码也会有帮助
  • Python 装饰器保留签名和用户定义的属性

    我有我的简单装饰器my decorator它装饰了my func def my decorator func def wrapper args kwargs return func args kwargs wrapper decorator
  • 在 Google 电子表格中运行脚本时出现权限错误

    我们正在开发一个使用 Google 电子表格作为输入的程序 电子表格的值被读取 处理 结果显示在网页中 当用户注册时 我们使用服务帐户从模板克隆电子表格 该模板有一些我们想要用来帮助用户在电子表格上引入值的脚本 但这些脚本似乎拥有服务帐户的
  • 如何创建类似 App Store 精选页面的布局?

    我是 iOS 开发新手 根据我的假设 App Store 中的功能页面是使用 UITableView 和 UICollectionView 的组合创建的 但在理论上和代码上如何做到这一点呢 我知道这有点模糊 因为很难描述它 但我只是需要一些
  • 如何在VBA中的公式中插入变量

    有人能解决这个问题吗 Sub test Dim i as integer For I 1 to 10 ActiveCell Offset 0 2 Formula Sum E15 i Next I End Sub 你的实际目标不清楚 你可能想
  • Git 日志不显示任何内容

    我有许多 git 存储库 带有提交 每个存储库在运行时都不显示任何内容git log 如果我在项目目录之外运行命令 没有 git 存储库 我会得到 致命 不是 git 存储库 或任何父目录 git 我尝试重新安装 Git 我现在运行的是 1
  • Python模块名称冲突

    我遇到过两个必须使用相同模块名称导入的 Python 模块 例如 import foo 我知道我想要的那个提供了某些功能 例如foo bar 那么有没有一种方法可以循环使用同名的模块 直到找到提供这些功能的模块 或者除了在安装之前重命名模块
  • 大数字的 CSS 字距调整

    我意识到在美国 大量的数字都是用 数以千计之间 所以你会写 1 000 000 00 在南非 是非标准的 可以用作小数点而不是 我们会写 1000000 00读起来很糟糕 典型的解决方案是使用一些空格 1 000 000 00 该解决方案的
  • 在变量周围使用大括号 (Brace) C++

    我正在编程课上学习二维数组 我的老师在没有解释的情况下使用了一些东西 我很好奇我们为什么使用它 由于它与符号有关 我不确定如何谷歌或搜索它 因为这些符号在搜索本身中使用 无论如何 代码是这样的 int small 26 0 large 26
  • 使用 Android api 创建新的同步日历

    我正在尝试在我的帐户上创建一个日历 以填充我从某些网站获得的事件 我搜索并找到了一些新的 android 4 0 日历示例 我对其进行了修改以获得我需要的内容 问题是日历已创建 其中充满了事件 但未与谷歌日历同步 因此在下次同步时它会被删除
  • ForkJoinPool 调度与 ExecutorService

    我对内部调度机制有点困惑ExecutorService和ForkJoinPool 我明白了ExecutorService调度已完成this way 一堆任务排队 一旦线程可用 它将处理第一个可用任务 依此类推 与此同时 一个ForkJoin
  • NHibernate Win Forms 会话管理

    我之前在 Web 应用程序中使用过 NHibernate 我必须承认 我仍在学习 NHibernate 并没有完全掌握会话管理的艺术 所以我想在我正在编写的 Win Forms 应用程序中使用 NHibernate 我听说表单应用程序中的会
  • Bash 在 rsync/subshel​​l exec 语句期间不捕获中断

    Context 我有一个 bash 脚本 其中包含一个子 shell 和一个用于 EXIT 伪信号的陷阱 并且它在执行期间没有正确捕获中断rsync 这是一个例子 bin bash logfile path to file director