26.3.2. Захват сигнала и выполнение действий
26.3.2. Захват сигнала и выполнение действий
Наиболее часто выполняемым действием является удаление временных файлов.
В следующем сценарии с помощью команд df и ps непрерывно добавляется информация во временные файлы HOLD1.$$ и HOLD2.$$. Не забывайте, что символы $$ заменяют ID процесса. Когда пользователь нажимает комбинацию клавиш [Ctrl+C], эти файлы удаляются.
$ pg trap2
#!/bin/sh
# trap2
# перехват только сигнала 2….<CTRL?C>
trap "my_exit" 2
HOLD1=/tmp/HOLD1.$$
HOLD2=/tmp/HOLD2.$$
my_exit {)
{
# my_exit
echo "<CTRL?C> detected..Now cleaning up..wait"
# удаление временных файлов
rm /tmp/*.$$ 2>/dev/null
exit 1
}
echo "processing…."
# основной цикл
while :
do
df >> $HOLD1
ps xa >>$HOLD2
done
Результаты выполнении этого сценария будут следующими:
$ trap2
processing….
<CTRL-C> detected..Now cleaning up..wait
При получении сигнала можно предоставлять пользователю определенный выбор. Однако если получены сигналы 2 или 3, следует убедиться, что они не появились случайно. Необходимо предусмотреть поток ошибок, благодаря чему выявляется ошибочное нажатие клавиш [Ctrl+C].
В следующем примере пользователю предоставляется возможность решить, следует ли выйти из сценария после получения сигнала 2. Отображается запрос о том, действительно ли пользователь желает завершить работу. Для уточнения предпринимаемого действия применяется конструкция case.
Если пользователь желает выйти из сценария, он выбирает 1, в результате чего после отображения статуса "exit 1" запускается процесс очистки. Если пользователь не желает выходить из сценария, никакие действия не производятся; зададим, что при выполнении конструкции case результаты выбора будут неудачными и произойдет возврат к исходному коду. Конечно, при подтверждении должны захватываться значения всех пустых полей.
Далее приводится функция, которая при получении сигнала предоставляет пользователю возможность выбора.
my_exit () {
# my_exit
echo -e " Received interrupt …"
echo "Do you really wish to exit ???"
echo " 1: Yes" echo " 2: No"
echo -n " Your choice [1..2] >"
read ANS
case $ANS in
1) # удаление временных файлов.. и т. д…
exit 1
;;
# не выполняет ничего
;; esac
}
Соответствующий сценарий выглядит так:
$ pg trap4
#!/bin/sh
#trap4
#перехват сигналов 1 2 3 и 15
trap "my_exit" 1 2 3 15
LOOP=0
# временные файлы
HOLD1=/tmp/HOLD1.$$
HOLD2=/tmp/HOLD2.$$
my_exit() {
# функция my_exit
echo -e " Recieved interrupt…"
echo "Do you wish to really exit ???"
echo " Y: Yes"
echo " N: No"
echo -n " Your choice [Y..N] >"
read ANS
case $ANS in
Y|y) exit 1;; # выход из сценария
N|n) ;; # возврат к обычной обработке
esac
}
# цикл while применяется здесь, например, для просмотра полей
echo -n "Enter your name :"
read NAME
echo -n "Enter your age :"
read AGE
Если при выполнении этого сценария происходит нажатие клавиш [Ctrl+C] в середине поля ввода (сразу после начала ввода имени), то пользователю предоставляется выбор: возвратиться к обычной обработке или выйти из сценария.
$ trap4
Enter your name :David Та
Received interrupt…
Do you really wish to exit ???
1: Yes
2: No
Your choice [1. .2] >2
Enter your age :