【问题标题】:How to send custom signal to bash daemon process?如何向 bash 守护进程发送自定义信号?
【发布时间】:2015-06-01 23:46:20
【问题描述】:

我有一个简单的 bash 守护程序在后台运行(具有 root 权限),它假设在收到通知时执行 action1 或/和 action2

我如何通知它/发送某种它会做出反应的信号?

我尝试过每 1 秒或更频繁地检查文件更改的方案,但这是一种不太理想的解决方案。

【问题讨论】:

    标签: bash daemon signals


    【解决方案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
    • @greenV 您可以使用命令kill -l 获取可用信号的列表。它将显示每个信号的编号和名称。用户定义的信号称为USR1USR2
    • @kasperd 不会像您期望的那样工作。当sleep 成为前台进程时,看起来在使用陷阱时,bash 会在内部对信号进行排队,直到命令完成(尽管它会在信号到达时处理它们)。这具有使信号实际上仅在前台命令完成后才被处理的效果。在您的情况下,您最终会等待一秒钟以将信号“传递”到脚本。根据您的用例,可能不会影响您,但需要注意。
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多