我在几个地方(包括如此)读到,-e被认为是“糟糕的形式”,在任何错误时退出脚本都是不可靠的。处理错误的更好方法似乎是使用trap,如下所示:
trap "echo there was an error; exit 1;" ERR
我似乎无法在手册页中找到ERR实际上是什么信号?我猜是SIGQUIT,但我不能确定。
man 7 signal
只有正常的信号,你会期望SIGTERM SIGQUIT SIGINT,等等。
man trap
有对ERR信号的引用,但似乎没有定义它。
例:"A trap on ERR, if set, is executed before the
在这个简单的脚本上
#!/bin/bash -i
trap 'echo "(ctrl+c was hit)"' INT
while true; do
echo -n "hit Enter..";read
echo "still on loop"
done
如果我点击ctrl+c,它将退出循环
如果我让它不像#!/bin/bash那样与第一行交互,它会起作用的!
问题是,我有几个脚本(与存储在~/.config/autostart中的“启动应用程序”一起运行),它们只在启用了交互性的#!/bin/bash -i下才能
我正在尝试使用以下代码限制ruby进程的执行时间:
trap("XCPU") do
abort "Max Time exceeded"
end
Process.setrlimit(:CPU, 5)
loop do
end
进程确实结束了,但是陷阱代码没有运行(我只是在命令行上被“杀死”了)。但是,当我将硬限制设置为大于5的值时,陷阱代码将运行
trap("XCPU") do
abort "Max Time exceeded"
end
Process.setrlimit(:CPU, 5, 6)
loop do
e
可能重复:
当使用类似于trap func_trap INT TERM EXIT的内容时:
func_trap () {
...some commands...
}
函数块中是否有一种检测的方法,陷阱称之为它?
类似于:
func_trap () {
if signal = INT; then
# do this
else
# do that
fi
}
或者,我是否需要为每种不同的陷阱类型编写一个单独的函数?是否有一个bash变量来保存最近接收到的信号?
提前感谢!
当子进程从终端接收到SIGINT时,我正在体验来自system()的一些奇怪的返回值。为了解释,在Perl脚本parent.pl中,我使用system()作为子进程运行另一个Perl脚本,但我也需要通过shell运行子程序,所以我使用了system 'sh', '-c', ...表单。因此,子进程的父进程变成了sh进程,sh进程的父进程变成了parent.pl。另外,为了避免sh进程接收SIGINT信号,我捕获了它。
例如,parent.pl
use feature qw(say);
use strict;
use warnings;
for (1..3) {
我试图了解信号处理程序是如何连接到进程以及它们对进程的作用域的。
class Main
Signal.trap('USR1') do
Process2.kill
end
def main_process
#do something
p = Process2.new
output = p.give_output
#then again do something
end
end
class Process2
Signal.trap('USR1') do
Process2.k
从bash脚本中,我试图处理来自c++程序的分段错误。我读过在SIGCHLD上使用SIGCHLD可用于此目的的文章。在陷阱中,我应该能够测试$?以从程序获得返回代码。例如,请参见。
这对我没用,我也搞不懂为什么。
下面是脚本:
#! /bin/bash
set -bm
trap 'echo "Trap result code $?"' CHLD
echo "Script: starting program"
./sigsegv
echo "Script: result code from program was $?"
正如