【发布时间】:2015-06-01 23:46:20
【问题描述】:
我有一个简单的 bash 守护程序在后台运行(具有 root 权限),它假设在收到通知时执行 action1 或/和 action2。
我如何通知它/发送某种它会做出反应的信号?
我尝试过每 1 秒或更频繁地检查文件更改的方案,但这是一种不太理想的解决方案。
【问题讨论】:
我有一个简单的 bash 守护程序在后台运行(具有 root 权限),它假设在收到通知时执行 action1 或/和 action2。
我如何通知它/发送某种它会做出反应的信号?
我尝试过每 1 秒或更频繁地检查文件更改的方案,但这是一种不太理想的解决方案。
【问题讨论】:
您可以使用kill 命令向进程发送信号。有一系列标准信号以及两个用户定义的信号,您可以让脚本处理您喜欢的任何方式。这是它在脚本中的样子
#!/bin/bash
handler(){
echo "Handler was called"
}
trap handler USR1
while sleep 1
do
date
done
要向脚本发送信号,您首先需要找到脚本的 pid,然后使用 kill 命令。它可能看起来像这样kill -USR1 24962。
【讨论】:
-USR1 是预定义的,还是我可以用任何东西代替 -USR1 ?
kill -l 获取可用信号的列表。它将显示每个信号的编号和名称。用户定义的信号称为USR1 和USR2。
sleep 成为前台进程时,看起来在使用陷阱时,bash 会在内部对信号进行排队,直到命令完成(尽管它会在信号到达时处理它们)。这具有使信号实际上仅在前台命令完成后才被处理的效果。在您的情况下,您最终会等待一秒钟以将信号“传递”到脚本。根据您的用例,可能不会影响您,但需要注意。
您可以使用kill 命令向进程发送信号。在 bash 中,您可以使用trap 命令创建一个signal handler。
#!/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
【讨论】: