【问题标题】:how to use kill SIGUSR2 in bash?如何在 bash 中使用 kill SIGUSR2?
【发布时间】:2013-07-09 10:52:00
【问题描述】:

我在linux中使用iptraf监控网络流量,shell命令是(make iptraf running in background):

iptraf -s eth0 -f -B -L ./traffic.dat

如果我想得到结果,我必须先停止iptraf,所以我使用shell命令:

kill -SIGUSR2 $pid

但是,如果我将这些 shell 命令移动到 bash 脚本文件 (net.sh) 中,我无法停止 iptraf,并且出现错误:

kill: SIGUSR2: invalid signal specification

我在脚本文件(net.sh)中使用了'kill -l',我发现没有名称是SIGUSR2的参数。如果我使用 USR2 或 -9,我将一无所获。

完整的脚本文件是:

    iptraf -s eth0 -f -B -L ./temp.txt
    pid=`ps -ef | grep iptraf | grep -v grep | awk '{print $2}'`
    kill -USR2 $pid
    cat temp.txt

执行这些命令后我什么也得不到。

如果我想得到结果应该怎么做?

【问题讨论】:

    标签: linux shell kill


    【解决方案1】:

    SIGUSR2 取决于体系结构,并且可以具有311217 之外的值。这在man 7 signal 中有描述。您必须找出适合您系统的值。通常这是通过查看以下内容来完成的:

    /usr/include/asm/signal.h 
    

    在我的系统上 - Ubuntu 12.04 AMD 64 - 它的值为12

    #define SIGUSR2     12
    

    一旦您知道系统上SIGUSR2 的正确数值,您就可以使用以下方法发送此信号:

    kill -SIGNO PID
    # In this case
    kill -12 PID
    

    【讨论】:

      【解决方案2】:

      在我的 Linux 机器上它可以工作。

      我跑了一个无限循环(pid = 4574),然后我跑了

      #!/bin/bash
      kill -l | grep USR2
      kill -SIGUSR2 4574
      

      kill -l 已显示信号,kill -SIGUSR2 已发送信号(杀死进程)。

      检查您是否正在运行 Bash 或其他一些 shell(例如,dash、busybox 等)

      【讨论】:

      • 非常感谢,但它不适用于我的 linux 机器。而且我仍然收到错误“kill:SIGUSR2:无效信号规范”。可能这个错误与linux环境有关?
      • @Mark 它与 SIG 前缀有关。请不带前缀运行它并检查
      【解决方案3】:

      执行此操作的跨平台方式:使用不带 SIG 前缀的 -s。例如:

      kill -s USR2 $pid

      这似乎适用于 MacOS 和 linux。

      【讨论】:

      • 我的 Yocto 构建,本质上是 BusyBox,也使用 POSIX 格式
      • 它也可以不带 -s 标志但不应该有 SIG 前缀
      猜你喜欢
      • 2012-12-01
      • 1970-01-01
      • 2016-01-11
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多