как использовать kill SIGUSR2 в bash?

Я использую iptraf для мониторинга сетевого трафика в linux, и команда оболочки (сделать iptraf работает в фоновом режиме):

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

если я хочу получить результат, я должен сначала остановить iptraf, поэтому я использую команду оболочки:

kill -SIGUSR2 $pid

однако я не мог остановить iptraf, если я перемещу эти команды оболочки в файл сценария bash(net.sh), и я получаю сообщение об ошибке:

kill: SIGUSR2: invalid signal specification

Я использую 'kill-l' в файле сценария(net.sh), и я нахожу, что нет параметра, имя которого это SIGUSR2. и я ничего не получу, если использую USR2 или -9.

полный файл скрипт:

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

Я ничего не получаю после этих команд.

что делать, если я хочу получить результат?

3 ответов


SIGUSR2 зависит от архитектуры и может иметь значение из 31, 12 или 17. Это описано в 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

на моем Linux box он работает.

Я запустил бесконечный цикл (pid = 4574), затем я запустил

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

убить-l показал сигнал и убить -SIGUSR2 послал сигнал (убив процесс).

Проверьте, используете ли вы Bash или другую оболочку (например, dash, busybox и т. д.)


Posix'y способ сделать это с помощью -s без SIG префикс. Напр.:

kill -s USR2 $pid

это, кажется, работает как на MacOS, так и на linux.