问题标签 [bash-trap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
763 浏览

bash - 在没有临时文件的情况下恢复陷阱

不带参数trap打印所有陷阱的当前设置命令。但是,子 shell 不继承陷阱,因此保存和恢复陷阱的规范示例在 bash 中失败:

分配的 RHS 上的陷阱在子 shell 中运行,因此 save_traps 始终是空字符串。除了将输出写入trap临时文件之外,脚本如何找到陷阱的当前命令集?

0 投票
5 回答
4944 浏览

linux - Bash 在 rsync/subshel​​l exec 语句期间没有捕获中断

语境:

我有一个 bash 脚本,其中包含一个子 shell 和一个用于 EXIT 伪信号的陷阱,并且它在rsync. 这是一个例子:

脚本的想法是这样的:大多数重要的逻辑都在一个子shell中运行,该子shell通过管道传输tee到一个日志文件,所以我不必tee对主逻辑的每一行都进行记录。每当 subshel​​l 结束,或脚本因任何原因停止(EXIT 伪信号应捕获所有这些情况)时,陷阱将拦截它并运行该cleanup()函数,然后移除陷阱。rsyncand命令(sleepsleep 只是一个例子)被运行exec以防止创建僵尸进程,如果我在它们运行时杀死父脚本,并且每个可能长时间运行的命令都包装在它自己的子 shell 中,这样当exec完成,它不会终止整个脚本。

问题:

如果我在执行 exec/subshel​​l 包装命令期间中断脚本(通过kill或 CTRL+C)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。

0 投票
1 回答
1437 浏览

bash - bash 脚本中的并发日志记录

我目前正试图弄清楚为什么 shell 脚本每隔一段时间就会在并发日志记录时失败。

我有一个如下的shell函数:

现在每隔一段时间就会失败并出现语法错误:

问题是,我有多个子进程,每个子进程都想记录并发送陷阱(在此期间也执行记录)。我已经调试了问题并发现,当同时输入该函数三次时会发生这种情况。首先main进程进入,然后child. 在执行完date部分之后l_textmainget 被 a 中断,trap这是由childand in this引起的,它trap试图记录一些东西。Thechild和 thetrap很好地完成了他们的日志记录,但随后main在陷阱之后恢复并尝试执行该hostname部分(假定)并失败并出现此错误。

因此,它似乎main不喜欢在生成$(date +'%Y-%m-%d %H:%M:%S') $(hostname -s) ${l_text}部分日志语句时进入睡眠状态并且不能很好地恢复。我假设这应该可以正常工作,因为我只是使用局部变量和线程安全的输出方法。

这是我在这里遇到的一般并发问题吗?还是这对于 bash 脚本中的陷阱机制非常具体?我知道 C 中 SIGNAL 处理的商品,所以我知道在 SIGNAL 处理程序中只允许某些操作。但是,我不知道在 bash 脚本中处理信号时是否也适用相同的预防措施。我试图找到这方面的文档,但我能找到的所有文档都没有表明脚本中的信号处理存在任何问题。

编辑

这是一个可用于复制问题的实际简单脚本:

每隔一段时间,这个脚本就会因为第 5 行的语法错误而被杀死。第 5 行是echo $text >> /dev/null,但是由于语法错误还提到了 hostname 命令,类似于我上面发布的那个,我假设有一个 -也有一个错误,实际错误在第 4 行,即local text="$(date +'%Y-%m-%d %H:%M:%S') $(hostname -s) $1".

有人知道如何处理上面的脚本来纠正它吗?我已经尝试将字符串的构造移到一些临时变量中:

这样,错误出现的频率就会降低,但它仍然存在,因此这不是真正的修复。

0 投票
1 回答
4697 浏览

bash - 为什么这个简单的 bash 陷阱会失败

我对 bash 脚本还是很陌生,我很难弄清楚为什么这个简单的陷阱没有按预期工作。

目标- 创建一个可以通过按CTRL+跳过的可选等待期C

CTRL+C - 的预期结果立即回显“没有时间打盹!” 并退出。

CTRL+C - 的实际结果立即回显“小睡时间结束”。并退出。

为什么我的陷阱函数没有被调用?

0 投票
2 回答
779 浏览

bash - Bash:如何捕获错误原因?

我想在 shell 脚本中捕获错误,然后生成一些错误原因的报告:

在我的error_handler函数中,我想给出ERR信号被捕获的原因(例如“权限被拒绝”、“找不到远程主机”等)。

这可能吗?

0 投票
1 回答
2276 浏览

linux - Bash 脚本:无法正确处理 SIGTSTP

我有一个安装和卸载设备的 bash 脚本,它在两者之间执行一些读取操作。由于设备非常慢,脚本大约需要 15 秒才能完成(挂载至少需要 5-6 秒)。由于安装此设备可能会导致其他问题,因此我不希望此脚本被中断。

话虽如此,我可以正确处理 SIGINT (Ctrl+c),但是当我尝试处理 SIGTSTP (Ctrl+z) 时,脚本会冻结。这意味着信号被捕获但处理程序没有运行。

我必须手动向进程发送 KILL 信号。知道为什么会发生这种情况以及如何解决吗?

0 投票
2 回答
3134 浏览

bash - 如何在 if 语句中捕获错误

运行以下代码:


产生以下输出:


如何在 if 语句中捕获“未找到命令”错误?

0 投票
2 回答
1692 浏览

bash - 执行返回非零值的函数时如何获取原始调用者lineno

我制作了一个 func.sh 脚本,其中包含:

然后我做了一个 main.sh 脚本

我的目标是捕获 lineno 4(在上面的脚本中),我没有正确管理返回值。

为此,我尝试了:

在这里,我想赶上lineno 23
输出是:

调用者在函数本身内部检测到正确的 lineno,但不是在陷阱中,其中脚本的名称是正确的(main.sh)但不是 lineno(1????而不是 22)

我也试过

但输出是:

函数本身内部的调用者仍在检测正确的lineno(在这种情况下为 21),但陷阱内部的情况更糟糕,因为它得到 lineno 8,这是 func.sh 中的 lineno ,其中有 return 1 ... (而陷阱内的调用者将该行引用到错误的脚本 main.sh)。

在这一点上,我的想法用完了......

0 投票
1 回答
1686 浏览

bash - 源文件如何继承陷阱调试?

运行以下代码段:


source.sh 在哪里


给出:


这意味着源文件中的每个命令都不会被 DEBUG 陷阱捕获。
实际上,如果我添加该行

在 source.sh 中作为第二行,一切都按需要进行(源文件中的命令也被捕获)。

如何将其设为默认行为以避免对我需要获取的任何文件重复上述行?换句话说:有没有机会告诉源文件继承调试陷阱?

0 投票
1 回答
3653 浏览

bash - bash 通过电子邮件发送错误

我写了一些 bash 脚本来做一些备份工作。我使用 errexit 和 pipefail 运行脚本,所以我不会错过任何错误。我现在想要的是脚本在发生错误时向我发送电子邮件。我得到了这个工作。但我希望将脚本错误包含在电子邮件正文中。我怎样才能做到这一点?

这是脚本:

非常感谢你的帮助!