Существует сигнал 0, который ранее уже рассматривался (при создании файла .logout). Этот сигнал является сигналом "выхода из интерпретатора shell". Чтобы переслать сигнал 0, введите в командную строку команду exit либо примените к процессу или укажите в командной строке комбинацию клавиш [Ctrl+D].
Для пересылки сигнала используется формат:
kill [- номер сигнала:| имя сигнала] ID процесса
Если команда kill вводится без указания номера или названия сигнала, то она по умолчанию относится к сигналу с номером 15. Для просмотра списка всех сигналов примените следующую команду:
$ kill -1 | |||||||
1) | SIGHUP | 2) | SIGINT | 3) | SIGQUIT | 4) | SIGILL |
5) | SIGTRAP | 6) | SIGIOT | 7} | SIGBUS | 8) | SIGFPE |
9) | SIGKILL | 10) | SIGUSR1 | 11) | SIGSEGV | 12) | SIGUSR2 |
13) | SIGPIPE | 14) | SIGALRM | 15) | SIGTERM | 17) | SIGCHLD |
18) | SIGCONT | 19) | SIGSTOP | 20) | SIGTSTP | 21) | SIGTTIN |
22) | SIGTTOU | 23) | SIGURG | 24) | SIGXCPU | 25) | SIGXFSZ |
26) | SIGVTALRM | 27) | SIGPROF | 28) | SIGWINCH | 29) | SIGIO |
30) | SIGPWR |
При пересылке сигнала 1 процесс заново считывает файл конфигурации. Например, если при выполнении процесса под названием демон dns файлы базы данных изменяются, не следует уничтожать демон и заново запускать его. Выполните всего лишь команду kill -1. В этом случае файлы конфигурации просматриваются заново.
Ниже приводится пример пересылки сигнала 9 (гарантированное уничтожение) для уничтожения процесса mon_web, который выполняется в системе. Сначала примените команду ps для создания процесса.
$ ps -ef | grep mon_web | grep -v root
157 ? S 0:00 mon_web
Если в системе не поддерживается команда ps -ef, то воспользуйтесь командой ps xa. Для уничтожения процесса можно применить команду:
kill -9 157
или
kill -s SIGKILL 157
В некоторых системах можно не указывать опцию -s. Например, введите команду
kill SIGKILL 157
В приведенном ниже сценарии уничтожение процесса основано на использовании имени процесса. Имя устраняемого процесса указывается в виде параметра. Выполняется проверка, что данный процесс был действительно уничтожен. Утилита grep используется для обнаружения всех совпадающих имен процесса. Если соответствующие имена обнаруживаются, поступает запрос пользователю, следует ли уничтожить найденные процессы. Для уничтожения процесса применяется команда kill -9.
Соответствующий сценарий выглядит следующим образом:
$ pg pskill
#!/bin/sh
# pskill
HOLD1=/tmp/HOLD1.$$
PROCESS=$1
usage () {
# usage
echo "Usage :''`basename $0` process_name"
exit 1
}
if [ $# -ne 1 ]; then
usage
fi
case $1 in
*)
применение программы grep для исключения нашего сценария из вывода команды ps
извлечение полей 1 и 6, перенаправление во временный файл
ps x | grep $PROCESS | grep -v $0 | awk '{print $1"\t" $6}'>$HOLD1
# ps -ef |.. если команда ps x не срабатывает
;;
esac
#есть ли файл??
if [ ! -s $HOLD1 ]; then
echo "No processes found…sorry"
exit 1
fi
#просмотр содержимого временного файла и отображение значений полей
while read LOOP1 LOOP2
do
echo $LOOP1 $LOOP2
done <$HOLD1
echo -n "Are these the processes to be killed? [y..n] >"
read ANS
case $ANS in
Y|y) while read LOOP1 LOOP2
do
echo $LOOP1
kill -9 $LOOP1 done
<$HOLD1
rm /tmp/*.$$
;;
N|n);;
esac
При выполнении сценария поток вывода имеет вид:
$ pskill web
1760 ./webmon
1761 /usr/apps/web_col
Are these the processes to be killed? [y..n] >y
1760 1761 [1]+ Killed webmon
Чтобы убедиться в том, что процесс уничтожен, введите команду повторно:
$ pskill web
No processes found..sorry
Некоторые сигналы можно захватить и выполнить соответствующие действия. Другие сигналы нельзя уловить. Например, если команда получает сигнал 9, пользователю не нужно предпринимать какие‑либо действия.