我有运行程序的脚本(不是我编写的),有些脚本在一些输入上出现段错误。我大批量执行这些操作,运行时间长达一周,并且想知道哪些输入触发了问题。就目前情况而言,我收到来自 Bash 的通知,表明我的某个脚本出现了段错误。但问题不在于脚本,而在于第三方程序及其输入。如果我知道输入的名称,我就可以解决这个问题。
我的 Bash 脚本中当前的调用形式是(例如程序“autofix”)
for indata in base*.fix; do
autofix $indata >${indata/.fix/.stdout} &
done
正如你所看到的,它们是在后台启动的,在我的主力服务器上,可能有多达 100 个左右同时启动,所以我无法判断哪一个失败了,而且我没有足够的耐心一次尝试全部 100 个,因为每个可能需要一个小时。捕获 stderr 不会捕获任何内容,因此我正在寻找其他想法。
我通过在 Bash 中使用我已经知道(或至少习惯于遇到)的东西,找到了一种内联解决方案。为了测试和说明,我使用了一个我编写的小型 C 程序,它只会导致 SEGFAULT:
然后经过一些尝试(见下面的评论),我在 Bash 中得到了这个简单的模式(这可能是一句单行话,但我提供了一种更易读的形式):
这不会因为SEGFAULT而死掉,而只是注意到它。因此,输出是“这个死了”,而不是“奇怪的成功”或整个过程错误。
如果需要,此方法会显示区分 SEGFAULT 和其他形式的进程失败的错误代码。