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

Deb*_*ger 21 bash signals copy-paste kill bash-trap

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

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

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

lhu*_*ath 19

下面的示例演示了一个父脚本,它sleep 5在启动两个执行自己操作的子节点之后执行某些操作(也sleep 5).当父退出时(无论何种原因),它标志着儿童终止(不SIGINT,终止是由信号SIGTERM,也是默认kill信号).然后孩子们在接待时做他们的事情SIGTERM.如果孩子是自己的脚本,我建议您更改陷阱上TERM掉进陷阱上EXIT让孩子收拾不管他们终止的原因是什么(只要它可以捕获).

注意我的使用wait.Bash在收到信号时不会中断正在运行的非内置命令.相反,它在命令完成后等待它们完成并处理信号.如果你使用wait,bash会立即停止等待并立即处理信号.

#!/usr/bin/env bash

trap 'echo parent shutting down; kill $(jobs -p)' EXIT

{ trap 'echo child 1 signaled' TERM; sleep 5 & wait; } &
{ trap 'echo child 2 signaled' TERM; sleep 5 & wait; } &

sleep 5
Run Code Online (Sandbox Code Playgroud)


Cas*_*bel -1

我不确定“其他脚本应该从主脚本捕获此信号”是什么意思?子进程脚本如何使用主脚本中的代码来捕获信号?

我不想尝试为您编写太多代码,因为我也不确切知道您所说的“由主脚本控制的脚本”是什么意思,但大概您启动了一些子进程,然后有一个控制循环来检查另一个进程是否脚本已退出,并且可以获取其退出状态吗?如果是这样的话,对我来说最有意义的事情就是让每个脚本进行自己的捕获和清理。当主脚本捕获信号时,如果需要,它可以将信号传递给所有子脚本(通过kill -s <signal> pid)。当子进程捕获信号时,它可以返回退出状态,表明它已被该信号终止。然后,main 可以适当地处理该退出状态 - 也许以与它本身收到该特定信号相同的方式进行处理。(Shell 函数是你的朋友。)