Робота з сигналами

Матеріал з Wiki TNEU
Версія від 13:36, 6 грудня 2011; Gerasymchuk (Обговорення)

(різн.) ← Попередня версія • Поточна версія (різн.) • Новіша версія → (різн.)
Перейти до: навігація, пошук

Можливості bash дозволяють перехоплювати й обробляти сигнали за допомогою сценарію. Під сигналами розуміється засіб, що дозволяє повідомляти процесам про різні події в операційній системі.

Список всіх сигналів можна отримати, ввівши команду:

$ Kill-l

Перехоплювати сигнали дозволяє команда trap. Загальний синтаксис команди:

trap [-lp] [команди сигнал сигнал ...]

Ключ-l виводить список імен і номерів сигналів, а ключ-p виводить список команд, пов'язаних з кожним сигналом. Сигнали слід вказувати за іменами або за номерами.
Система завжди якимось чином реагує на отримання сигналу, тобто виконує команду. Якщо ж замість команди вказати порожній рядок, то сигнал просто буде проігнорований.
Наведу невеликий список найбільш часто зустрічаються сигналів:
HUP - hangup, відбій;
INT - interrupt, переривання;
QUIT - вихід;
ILL - illegal instruction, програмна помилка;
FPE - floating point exception, обчислювальна помилка;
KILL - вбити процес;
TERM - termination, завершити процес;
CHILD - завершився дочірній процес.
Приклад:

trapINT # ігнорувати сигнал INT

Для того, щоб протоколювати процес роботи свого скрипта, потрібно використовувати команду tee. Команда копіює дані зі свого стандартного потоку введення і роздвоює їх на стандартний потік вводу і в зазначений файл логу. Для пояснення наведу приклад:

$ Cat listfile * | sort | tee check.file | uniq> result.file

Тут, у файл check.file будуть записані дані з усіх «listfile *», в відсортованому вигляді до того, як повторювані рядки будуть видалені командою uniq.
Також існує інший спосіб протоколювання. Він полягає у використанні команди script, яка копіює в файл весь сеанс роботи в текстовій консолі: введення користувача і виведення команд. Якщо проводити запуск команди script вручну, то зупинити протоколювання можна командою exit.
Наведу приклад:

LOGFILE = log if ["$ LOGGING" == "true"]; then script myscript $ LOGFILE; else myscript; fi

Для того, щоб викликати сценарій всередині свого сценарію, потрібно використовувати команду exec:

exec script $ 0 $ LOGFILE

Особисті інструменти
Простори назв

Варіанти
Дії
Навігація
Інструменти