当我在bash中使用"trap"命令时,替换给定信号的先前陷阱.
是否有办法为同一信号制造多个陷阱?
我的bash代码中有很多退出点.我需要在退出时做一些清理工作,所以我使用trap为这样的退出添加一个回调:
trap "mycleanup" EXIT
Run Code Online (Sandbox Code Playgroud)
问题是有不同的退出代码,我需要做相应的清理工作.我可以在mycleanup中获得退出代码吗?
可能重复:
在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变量保存最新收到的信号?
提前致谢!
我有一个由主要脚本控制的脚本集合.我想在主脚本中捕获信号ctrl+ c并将其传播给其他人.其他脚本也应该捕获此信号(从主脚本)并进行一些清理......
我试图发送kill -s SIGINT给孩子们,但他们似乎无法捕捉到信号(即使trap 'Cleanup' SIGINT是在儿童脚本上定义的)
任何线索如何实现这一点?
我想使用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陷阱处理程序,这些陷阱处理程序不会永久地删除可能已经设置或可能尚未设置的现有处理程序?如何动态管理陷阱例程的任意链?
有没有办法保存陷阱处理程序的当前状态,以便以后可以恢复?
我想知道是否有一种方法可以trap在GNU中实现make,类似于内置的BASH?
如果用户按下CTRL-C,或者make自身失败(非零退出),我想调用特定目标或宏.
在子/后台进程中运行时,我无法捕获信号.
这是我简单的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后,它似乎正常工作......?
打开一个名为"伏藏"终端,并运行创建的文件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)打开一个名为"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.
打开一个名为"特玛"终端,运行创建的文件callback.sh …
我想捕获从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从脚本发送到另一个?
问候,
调试器