Читаем UNIX полностью

Последовательность команд — единый аргумент, поэтому его почти всегда нужно брать в кавычки. Номера сигналов обозначаются небольшими целыми числами, например, 2 соответствует сигналу, возникающему при нажатии клавиши DEL, а 1 — сигналу, возникающему при отключении от сети. Номера сигналов, наиболее часто используемых в shell-программах, приведены в табл. 5.4.

0Выход из интерпретатора (по любой причине, включая конец файла)
1Отбой
2Прерывание (клавиша DEL)
3Останов (ctl-\; вызывает распечатку содержимого памяти программы)
9Уничтожение (нельзя перехватить или игнорировать)
15Окончание выполнения; сигнал по умолчанию, производимый kill(1)

Таблица 5.4: Номера сигналов в интерпретаторе

Для удаления временных файлов в команде watchwho вызов команды trap должен указываться перед циклом, чтобы перехватить сигналы прерывания, отбоя и окончания выполнения:

...

trap 'rm -f $new $old; exit 1' 1 2 15

while:

...

Последовательность команд, образующих первый аргумент команды trap, подобна вызову подпрограммы, который происходит сразу по возникновении сигнала. Когда эта последовательность окончится, прерванная программа возобновляется с места прерывания, если только сигнал не уничтожит ее. Таким образом, последовательность команд в trap должна явно вызывать exit, иначе shell-программа продолжит свое выполнение после прерывания. Кроме того, последовательность команд будет читаться дважды: при установке команды trap и при обращении к ней. Поэтому последовательность команд лучше защищать апострофами, чтобы значения переменных вычислялись только при выполнении программ, указанных в команде trap. В данном случае это не имеет значения, но позднее вы столкнетесь с ситуацией, когда это важно. Кстати, флаг -f предписывает команде rm не задавать вопросов.

Иногда команду trap полезно применять в диалоговом режиме, чаще всего для того, чтобы не допустить уничтожения программы сигналом отбоя, возникшим при обрыве телефонной связи:

$ (trap "" 1; долго_выполняемая команда) &

2134

$

Для процесса и его потомков пустая последовательность означает, что нужно игнорировать прерывания. При наличии скобок команда trap и долго_выполняемая_команда выполняются порожденным интерпретатором вместе и как фоновые; без них команда trap действовала бы на исходный интерпретатор, так же как и на долго_выполняемую_команду.

Команда nohup(1) — небольшая shell-программа, обеспечивающая непрерывное выполнение команд. Ниже полностью приведен ее вариант из седьмой версии:

$ cat 'which nohup'

trap "" 1 15

if test -t 2>&1

then

 echo "Sending output to 'nohup.out'"

 exec nice -5 $* >>nohup.out 2>&1

else

 exec nice -5 $* 2>&1

fi

$

Команда test -t проверяет, направлен ли стандартный выходной поток на терминал, чтобы вы могли решить, следует ли его сохранять. Фоновая программа выполняется с помощью команды nice, что снижает ее приоритет по сравнению с диалоговыми программами. (Обратите внимание, что команда nohup не устанавливает значение PATH. А может быть, это нужно?)

Команда exec использована только для повышения эффективности; команда nice может выполняться и без нее. Exec — встроенная команда интерпретаторов, которая заменяет процесс, играющий роль текущего интерпретатора, на указанную программу. Таким образом она избавляется от одного процесса, а именно от интерпретатора, обычно ожидающего завершения программы. Мы могли бы применять exec и в некоторых других программах, например в конце обобщенной программы cal, когда происходит обращение к /usr/bin/cal.

Кстати, сигнал 9 — это тот сигнал, который нельзя перехватить или игнорировать: он всегда уничтожает процесс. На языке shell его посылка задается с помощью

$ kill -9 номер_процесса

Обращение kill -9 не является стандартным, поскольку процессу, уничтоженному таким способом, не дается время для приведения в порядок своих дел перед "смертью".

Упражнение 5.14

В приведенной выше версии команды nohup стандартный поток диагностики команды соединяется со стандартным выходным потоком. Хорошее ли это решение? Если нет, то как бы вы разделили их явно?

Перейти на страницу:

Похожие книги