shell
-программах, приведены в табл. 5.4.
0 | Выход из интерпретатора (по любой причине, включая конец файла) |
1 | Отбой |
2 | Прерывание (клавиша |
3 | Останов ( |
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
не является стандартным, поскольку процессу, уничтоженному таким способом, не дается время для приведения в порядок своих дел перед "смертью".
В приведенной выше версии команды nohup
стандартный поток диагностики команды соединяется со стандартным выходным потоком. Хорошее ли это решение? Если нет, то как бы вы разделили их явно?
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии