问题标签 [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 投票
1 回答
1346 浏览

bash - 美元?内部 bash 陷阱

从 bash 脚本,我正在尝试处理来自 c++ 程序的分段错误。我读过 using traponSIGCHLD可用于此目的。在陷阱内部,我应该能够测试$?以从程序中获取返回码。例如,请参阅https://unix.stackexchange.com/questions/24307

它对我不起作用,我不知道为什么。

这是脚本:

正如您可能猜到的那样,该sigsegv程序只会导致段错误:

当我运行包装脚本时,我得到了这个:

关键是Trap result code 0。这就是我希望它说 139 表示 SIGSEGV 的地方(即 128 基值 + SIGSEGV 的 11)。

如果它很重要,RHEL 6.2, bash 4.1.2(1)-release。

0 投票
1 回答
426 浏览

bash - bash 陷阱后恢复

我有一个带有一些文件操作的 bash 脚本,我想在按下CTRL+后处理一个循环直到块结束C。我做了一个例子:

这似乎工作得很好,但我注意到,有时 BASE 在语句中

如果在 basename 命令期间发生陷阱,则未设置。这会导致cp以下命令和以下命令出错。

我错过了什么吗?bash 的意图是如何从陷阱中恢复?是否有另一种具有相同效果的解决方案?

0 投票
1 回答
5968 浏览

bash - 在“trap EXIT”中获取 shell 脚本的退出代码

我想在我的 Bash 脚本中进行清理操作,如下所示:

使用$?是一种自然的选择,但事实并非如此。它总是包含0. 有什么方法可以“窥探”ERR陷阱中的退出代码吗?

[更新:]我不知道我之前测试过什么。这段代码就像一个魅力,所以我把它留在这里作为一个小而好的例子。

0 投票
2 回答
6817 浏览

linux - Shell 脚本通过 Trap 获取 CTRL+Z

我正在尝试在我的脚本中获取 SIGSTOP CTRL+信号。Ztrap

当我的脚本正在执行时,如果我暂时暂停执行,发送一个 SIGSTOP 信号CTRL+ Z,它需要删除我在其中创建的文件并终止执行。

我不明白为什么以下脚本不起作用。但是,更重要的是,正确的方法是什么?

编辑

SIGSTOP不能被困,但SIGTSTP可以被困,根据我在互联网上搜索CTRL后的理解以及下面的答案,使用+发送信号时陷阱是正确的Z。但是,当我在运行脚本时按CTRL+时,它会卡住,这意味着无论我之后发送什么信号,脚本都会无休止地执行。 Z在此处输入图像描述

0 投票
1 回答
538 浏览

bash - 脚本中的 Trap 命令在从 CLI 调用时有效,但在 PBS 作业中使用时无效

我有以下简单的 bash 脚本:

当我从命令行运行此脚本时:即

然后通过发送 CTRL+CI 中断脚本获取两封电子邮件。一个包含消息:“收到信号退出”。另一个包含消息“收到信号 SIGINT”。

但是,当我将此脚本作为 PBS 作业运行时:

然后等待一两分钟,对提交的作业执行 qdel,我只收到一封包含“received signal EXIT”的电子邮件。虽然我还希望收到一封说明收到信号 SIGTERM 的电子邮件,但因为 qdel 手册页指出:

有人知道这是为什么吗?理想情况下,当我的脚本中的某些内容返回不同于 0 的退出代码时,我希望收到一封电子邮件,但我也想在脚本提前终止时收到一封不同的电子邮件,例如由于 SIGINT 或 SIGTERM。

一些附加信息,当我修改该行时:

我可以看到执行的最后一个命令是“mailx -s”SIGTERM”“someone@anywhere.com”而不是“sleep 1000”。所以它似乎是 SIGTERM 信号被捕获的情况,但随后的陷阱命令确实不适用于 PBS 工作...

0 投票
1 回答
740 浏览

bash - 退出带有陷阱的函数及其错误代码

假设我有以下功能:

如果我运行f并等待那 10 秒然后执行

这是预期的。但是,如果我运行f并点击Ctrl+c,该功能f将被中止,但是

而不是1. 我认为我没有正确地陷印,但不知道如何解决它。

0 投票
3 回答
446 浏览

bash - Why does my bash script take so long to respond to kill when it runs in the background?

(Question revised, now that I understand more about what's actually happening):

I have a script that runs in the background, periodically doing some work and then sleeping for 30 seconds:

If I try to kill this script via kill or kill INT, it takes 30 seconds to respond to the signal.

I will answer this question below, since I found a good explanation online.

(My original, embarrassingly un-researched question)

This question is for a bash script that includes the following trap:

If I run the script in the foreground, and hit CTRL-C, it gets the signal immediately and exits (under one sec).

If I run the same script in the background (&), and kill it via kill or kill -INT, it takes 30 seconds before getting the signal.

Why is that, and how can I fix it?

0 投票
1 回答
4327 浏览

bash - 在脚本中终止 tcpdump 并继续执行下一个命令

我正在尝试创建一个脚本,其中包含:

在我使用 CTRL+CI 终止 tcpdump 后,希望执行这些命令:

第一部分已经完成,但在我按下 CTRL+CI 后会被抛出提示。我尝试了等待,使用陷阱 SIGINT,同样的问题。

现在把显而易见的事情排除在外:为什么不简单地管道所有内容而不将中间未过滤的输出转储到临时文件?好吧,我试过了,但似乎信息在我的屏幕输出中丢失了(繁忙的服务器,不知道),我发现打破这样的命令将使我获得完整的输出。

更新:根据我在下面得到的答案,我尝试这样做,这似乎是使其工作的最安全方法:

它不起作用。生成了“文件”,但 sed | 似乎没有读取和过滤其内容 在我执行 CTRL+C 之后的 awk 语法,它甚至没有被 rm 命令删除,所以这进一步证明了辅助的被困函数没有被执行。我不明白这种行为,我做错了吗?

更新2:我可以让它正常工作的唯一方法是这样的:

但是我无法通过杀死后台进程来抑制输出,尝试了我能找到的所有解决方案: 在后台运行 bash 命令而不打印作业和进程 ID - 这使我的陷阱不起作用;使用 Bash 脚本,如何抑制命令的所有输出?- 这里的所有变体都不起作用,无论我做什么,我仍然得到输出。尝试定义 $! 使用另一个变量,尝试了 /dev/null 的所有变体,尝试将其放在陷阱命令中,没有用。

0 投票
2 回答
4030 浏览

bash - 如何防止通过 su -c 调用的 bash 脚本在 SIGINT 之后挂起

我有两个脚本。这些都被简化了。root-script.sh来电userscript.sh:_

根脚本.sh:

用户脚本.sh:

如果我调用 user-script.sh 它就可以正常工作:

如果我调用root-script.shasroot并输入 Ctrl-C 我得到

比我找回根提示符,但提示符被阻止了。使用 ps 我看不到根脚本,只有用户脚本。如果我终止用户脚本,则根提示符将再次可用。

如何防止 root-script-user-script-construction 在 SIGINT 之后挂起?对我来说意味着

  1. 退出root-script.shuser-script.sh
  2. root-script-user-script-construction 应该与user-script.sh

    • bash 版本:3.2.51(1)-release (x86_64-suse-linux-gnu)
    • 操作系统版本:sles11 3.0.93-0.8-default
0 投票
1 回答
1241 浏览

bash - 如何在bash中捕获信号后打印消息并继续?

我想在 bash 中这样做:

这工作得很好,除了我希望脚本继续。我怎样才能做到这一点?如果我将命令保留为空白字符串,脚本将继续,但不打印任何内容。我可以同时打印消息并继续吗?