标签: bash-trap

多个bash陷阱用于相同的信号

当我在bash中使用"trap"命令时,替换给定信号的先前陷阱.

是否有办法为同一信号制造多个陷阱?

bash bash-trap

54
推荐指数
6
解决办法
2万
查看次数

如何在Bash脚本中捕获退出代码

我的bash代码中有很多退出点.我需要在退出时做一些清理工作,所以我使用trap为这样的退出添加一个回调:

trap "mycleanup" EXIT
Run Code Online (Sandbox Code Playgroud)

问题是有不同的退出代码,我需要做相应的清理工作.我可以在mycleanup中获得退出代码吗?

bash signals exit-code bash-trap

42
推荐指数
4
解决办法
4万
查看次数

是否有可能在bash中检测*哪个*陷阱信号?

可能重复:
在bash shell脚本中标识接收到的信号名称

当使用类似的东西trap func_trap INT TERM EXIT时:

func_trap () {
    ...some commands...
}
Run Code Online (Sandbox Code Playgroud)

功能块中有没有办法检测哪个陷阱调用了它?

就像是:

func_trap () {
    if signal = INT; then
        # do this
    else
        # do that
    fi
}
Run Code Online (Sandbox Code Playgroud)

或者我是否需要为每个陷阱类型编写一个单独的函数来执行不同的操作?是否有一个bash变量保存最新收到的信号?

提前致谢!

bash bash-trap

23
推荐指数
2
解决办法
9975
查看次数

如何通过脚本集合传播信号?

我有一个由主要脚本控制的脚本集合.我想在主脚本中捕获信号ctrl+ c并将其传播给其他人.其他脚本也应该捕获此信号(从主脚本)并进行一些清理......

我试图发送kill -s SIGINT给孩子们,但他们似乎无法捕捉到信号(即使trap 'Cleanup' SIGINT是在儿童脚本上定义的)

任何线索如何实现这一点?

bash signals copy-paste kill bash-trap

21
推荐指数
2
解决办法
8748
查看次数

执行另一个二进制文件时如何实现bash EXIT陷阱?

我想使用bash EXIT陷阱使用exec以避免产生新进程.这可能吗?

那是,

#!/bin/bash
touch $0.$$
trap "rm -v $0.$$" EXIT
/bin/echo Hello
Run Code Online (Sandbox Code Playgroud)

$0.$$使用bash的EXIT陷阱删除临时文件

#!/bin/bash
touch $0.$$
trap "rm -v $0.$$" EXIT
exec /bin/echo Hello
Run Code Online (Sandbox Code Playgroud)

永远不会"触发"陷阱(完成后没有来自rm文件的消息$0.$$).

当然,它是有道理的,陷阱不会发射,因为bash不再受到控制exec.有没有办法让它工作使用exec?诚然,这不仅仅是出于好奇而不是实际问题.

bash exec bash-trap

20
推荐指数
1
解决办法
3727
查看次数

保存并恢复陷阱状态?管理多个陷阱处理程序的简便方法?

有什么方法可以覆盖bash陷阱处理程序,这些陷阱处理程序不会永久地删除可能已经设置或可能尚未设置的现有处理程序?如何动态管理陷阱例程的任意链?

有没有办法保存陷阱处理程序的当前状态,以便以后可以恢复?

arrays bash stack bash-trap

17
推荐指数
1
解决办法
2270
查看次数

如何在GNU make中捕获错误和中断?

我想知道是否有一种方法可以trap在GNU中实现make,类似于内置的BASH

如果用户按下CTRL-C,或者make自身失败(非零退出),我想调用特定目标或宏.

signals makefile gnu-make bash-trap

14
推荐指数
3
解决办法
6124
查看次数

陷阱信号在儿童背景过程中

在子/后台进程中运行时,我无法捕获信号.

这是我简单的bash脚本:

#!/bin/bash

echo "in child"

trap "got_signal" SIGINT

function got_signal {
  echo "trapped"
  exit 0
}

while [ true ]; do
    sleep 2
done
Run Code Online (Sandbox Code Playgroud)

当运行这个以后再做

kill -SIGINT (pid)
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,打印"被困"并退出.

现在,如果我从父脚本启动相同的脚本,如下所示:

#!/bin/bash

echo "starting the child"

./child.sh &
Run Code Online (Sandbox Code Playgroud)

然后孩子不再陷入信号......?

更改为使用SIGTERM而不是SIGINT后,它似乎正常工作......?

bash signals sigint child-process bash-trap

14
推荐指数
2
解决办法
7414
查看次数

何时处理信号以及为什么某些信息会冻结?

  1. 打开一个名为"伏藏"终端,并运行创建的文件callback.sh/bin/bash callback.sh.

    cat  callback.sh
    #!/bin/bash
    myCallback() {
        echo "callback function called at $(date)"
    }
    trap myCallback SIGUSR1
    sleep 20 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 打开一个名为"termB"的新终端并运行:

    pkill -USR1  -f  callback.sh
    
    Run Code Online (Sandbox Code Playgroud)

在termA中20秒后显示以下内容; 它永远不会在termA中显示:

callback function called at Mon Nov 19 08:21:52 HKT 2018
Run Code Online (Sandbox Code Playgroud)

结论证实,当Bash在前台执行外部命令时,它不处理任何接收的信号,直到前台进程终止(参见信号陷阱).

做一点改变callback.sh:

cat  callback.sh
#!/bin/bash
myCallback() {
    echo "callback function called at $(date)"
}
trap myCallback SIGUSR1
while true; do
    read -p  "please input something for foo: " foo
done
Run Code Online (Sandbox Code Playgroud)

添加无限while循环并删除sleep 20.

  1. 打开一个名为"特玛"终端,运行创建的文件callback.sh …

linux bash bash-trap

14
推荐指数
1
解决办法
313
查看次数

如何从脚本向脚本发送信号SIGINT?BASH

我想捕获从Script-A.sh发送到Script-B.sh的信号,所以在Script-A.sh中我使用命令

(将SIGINT发送到Script-B.sh)
kill -2 $ PID_Script-B.sh

在Script-B.sh中,我捕获信号并调用函数Clean

陷阱'清洁'2

它不起作用,而是立即杀死Script-B.sh而不执行Clean !!

我还注意到,如果我想将SIGINT从终端发送到任何捕获它的脚本,ctrl-c将会正确捕获,但如果我通过命令指定信号则不会kill -2 $pid_of_script

有没有想过发送SIGINT(ctrl-cVS kill -2 $pid_of_script)的两种方法之间的区别,以及如何将SIGINT从脚本发送到另一个?

问候,

调试器

bash signals kill bash-trap

13
推荐指数
1
解决办法
2万
查看次数