Онлайн-рабочие станции OnWorks Linux и Windows

Логотип

Бесплатный хостинг в Интернете для рабочих станций

<Предыдущая | Содержание: | Следующая>

Ловушки

В главе 10 мы увидели, как программы могут реагировать на сигналы. Мы также можем добавить эту возможность в наши сценарии. Хотя сценарии, которые мы написали до сих пор, не нуждались в этой возможности (поскольку они имеют очень короткое время выполнения и не создают временные файлы), более крупные и сложные сценарии могут выиграть от наличия подпрограммы обработки сигналов.

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

колотить предоставляет для этой цели механизм, известный как ловушка. Ловушки реализуются с помощью встроенной команды с соответствующим названием: ловушка. ловушка использует следующий синтаксис:

ловушка сигнал аргумента [сигнал...]

в котором аргумент это строка, которая будет читаться и обрабатываться как команда и сигнал это спецификация сигнала, который инициирует выполнение интерпретируемой команды.

Вот простой пример:



#! / Bin / Баш


# ловушка-демо: простая демонстрация обработки сигналов

#! / Bin / Баш


# ловушка-демо: простая демонстрация обработки сигналов


ловушка "echo 'Я тебя игнорирую'" SIGINT SIGTERM для i в {1..5}; делать

echo "Итерация $i из 5" сон 5

сделанный

ловушка "echo 'Я тебя игнорирую'" SIGINT SIGTERM для i в {1..5}; делать

echo "Итерация $i из 5" сон 5

сделанный


Этот скрипт определяет ловушку, которая будет выполнять эхо команду каждый раз при получении сигнала SIG-INT или SIGTERM во время выполнения сценария. Выполнение программы выглядит так, когда пользователь пытается остановить скрипт, нажав Ctrl-C:


[я @ linuxbox ~] $ ловушка-демо

Итерация 1 из 5

Итерация 2 из 5 Я вас игнорирую. Итерация 3 из 5 Я вас игнорирую. Итерация 4 из 5

Итерация 5 из 5

[я @ linuxbox ~] $ ловушка-демо

Итерация 1 из 5

Итерация 2 из 5 Я вас игнорирую. Итерация 3 из 5 Я вас игнорирую. Итерация 4 из 5

Итерация 5 из 5


Как мы видим, каждый раз, когда пользователь пытается прервать программу, вместо этого выводится сообщение.

Построение строки для формирования полезной последовательности команд может быть неудобным, поэтому общепринятой практикой является указание функции оболочки в качестве команды. В этом примере для каждого обрабатываемого сигнала указывается отдельная функция оболочки:



#! / Bin / Баш

# ловушка-demo2: простая демонстрация обработки сигналов exit_on_signal_SIGINT () {

echo «Сценарий прерван». 2>&1 выход 0

}


exit_on_signal_SIGTERM () {

echo «Сценарий завершен». 2>&1 выход 0

}


ловушка exit_on_signal_SIGINT ловушка SIGINT exit_on_signal_SIGTERM SIGTERM

#! / Bin / Баш

# ловушка-demo2: простая демонстрация обработки сигналов exit_on_signal_SIGINT () {

echo «Сценарий прерван». 2>&1 выход 0

}


exit_on_signal_SIGTERM () {

echo «Сценарий завершен». 2>&1 выход 0

}


ловушка exit_on_signal_SIGINT ловушка SIGINT exit_on_signal_SIGTERM SIGTERM



для меня в {1..5}; делать

echo "Итерация $i из 5" сон 5

сделанный


для меня в {1..5}; делать

echo "Итерация $i из 5" сон 5

сделанный


В этом скрипте есть два ловушка команды, по одной на каждый сигнал. Каждая ловушка, в свою очередь, определяет функцию оболочки, которая должна выполняться при получении определенного сигнала. Обратите внимание на включение выход команду в каждой из функций обработки сигналов. Без выход, сценарий продолжит работу после завершения функции.

Когда пользователь нажимает Ctrl-C во время выполнения этого скрипта результаты выглядят так:



[я @ linuxbox ~] $ ловушка-демо2

Итерация 1 из 5

Итерация 2 из 5 Сценарий прерван.

[я @ linuxbox ~] $ ловушка-демо2

Итерация 1 из 5

Итерация 2 из 5 Сценарий прерван.


изображение

Временные файлы

Одной из причин включения обработчиков сигналов в сценарии является удаление временных файлов, которые сценарий может создать для хранения промежуточных результатов во время выполнения. В присвоении имен временным файлам есть что-то вроде искусства. Традиционно программы в Unix-подобных системах создают временные файлы в / Tmp каталог, общий каталог, предназначенный для таких файлов. Однако, поскольку каталог является общим, это создает определенные проблемы с безопасностью, особенно для программ, работающих с привилегиями суперпользователя. Помимо очевидного шага по установке правильных разрешений для файлов, доступных всем пользователям системы, важно давать временным файлам непредсказуемые имена файлов. Это позволяет избежать эксплойта, известного как атака на временную гонку. Один из способов создать непредсказуемое (но все же описательное) имя — сделать что-то вроде этого:

tempfile=/tmp/$(базовое имя $0).$$.$RANDOM

Это создаст имя файла, состоящее из имени программы, за которым следует идентификатор процесса (PID), а затем случайное целое число. Однако обратите внимание, что $RAN-ДОМ Переменная оболочки возвращает значение только в диапазоне 1–32767, что в компьютерных терминах является не очень большим диапазоном, поэтому одного экземпляра переменной недостаточно, чтобы одолеть решительного злоумышленника.



изображение

Лучшим способом является использование мктемп программа (не путать с мктемп стандартная библиотечная функция) для присвоения имени и создания временного файла. мк- темп Программа принимает шаблон в качестве аргумента, который используется для создания имени файла. Шаблон должен включать серию символов «X», которые заменяются соответствующим количеством случайных букв и цифр. Чем длиннее серия символов «X», тем длиннее серия случайных символов. Вот пример:

tempfile=$(mktemp /tmp/foobar.$$.XXXXXXXXXX)

При этом создается временный файл и присваивается его имя переменной. временный файл. Символы «X» в шаблоне заменяются случайными буквами и цифрами, так что окончательное имя файла (которое в этом примере также включает расширенное значение специального параметра $$ для получения PID) может быть примерно таким:

/tmp/foobar.6593.UOZuvM6654

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

[[ -d $HOME/tmp ]] || mkdir $HOME/tmp


Лучшие облачные вычисления для ОС в OnWorks: