如何向bash守护进程发送自定义信号?

9

我有一个简单的bash守护进程在后台运行(具有root权限),当通知到达时,它应该执行action1和/或action2

我该如何通知它/发送某种信号以触发其反应?

我尝试了每秒检查文件更改等场景,但这是一种不太理想的解决方案。

2个回答

11

您可以使用kill命令向进程发送信号。有一系列标准信号以及两个用户定义的信号,您可以按照自己喜好处理脚本。以下是在脚本中实现此操作的示例:

#!/bin/bash

handler(){
    echo "Handler was called"
}

trap handler USR1

while sleep 1
do
    date
done

要向脚本发送信号,您首先需要找到脚本的 pid,然后使用 kill 命令。它可能看起来像这样 kill -USR1 24962


1
“-USR1” 是预定义的吗?还是我可以用其他内容替换 “-USR1”? - greenV
@greenV 你可以使用命令 kill -l 获取可用信号的列表。它将显示每个信号的编号和名称。用户定义的信号称为 USR1USR2 - kasperd
1
@kasperd,这不会像你期望的那样起作用。当sleep成为前台进程时,使用trap时,bash内部似乎将信号排队,直到命令完成(尽管它在信号到达时处理它们)。这会导致信号实际上只有在前台命令完成后才被处理。在您的情况下,您最终要等待一秒钟才能将信号“传递”到脚本中。这可能不会影响您,具体取决于您的用例,但需要注意。 - Matthew Ife

2
您可以使用kill命令向进程发送信号。在bash中,您可以使用trap命令创建信号处理程序
#!/bin/bash
# traptest.sh

trap "echo Booh!" SIGINT SIGTERM
echo "pid is $$"

while :         # This is the same as "while true".
do
        sleep 60    # This script is not really doing anything.
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接