11

I use iptraf to monitor the network traffic in linux, and the shell command is(make iptraf running in background):

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

if I want to get the result, I have to stop iptraf first, so I use the shell command:

kill -SIGUSR2 $pid

however, I could not stop iptraf if I move these shell commands into a bash script file(net.sh), and I get an error:

kill: SIGUSR2: invalid signal specification

I use 'kill -l' in the script file(net.sh), and I find there is no parameter which name is SIGUSR2. and I would get nothing if I use USR2 or -9.

the complete script file is:

    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

I get nothing after these commands.

what shoud I do if I want to get the result?

4

3 回答 3

17

SIGUSR2 is architecture depended and can have a value out of 31, 12 or 17. This is described in man 7 signal. You'll have to find out which value is appropriate for your system. Usually this is done by having a look into:

/usr/include/asm/signal.h 

On my system - Ubuntu 12.04 AMD 64 - it has a value of 12:

#define SIGUSR2     12

Once you know the proper numeric value for SIGUSR2 on your system, you can send this signal using:

kill -SIGNO PID
# In this case
kill -12 PID
于 2013-07-11T08:44:28.730 回答
9

On my Linux box it works.

I ran an infinite loop (pid = 4574), then I ran

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

kill -l has showed the signal and kill -SIGUSR2 has sent the signal (killing the process).

Check if you are running Bash or some other shell (e.g., dash, busybox, etc.)

于 2013-07-11T08:50:37.690 回答
6

Cross-platform way to do this: use -s without the SIG prefix. E.g.,:

kill -s USR2 $pid

This seems to work on both MacOS and linux.

于 2017-02-12T20:19:30.137 回答