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 :