BASH-скрипты и Ctrl+C
EasyPK всегда страдал тем, что не мог корректно завершиться при нажатии Ctrl+C — он просто прерывал процесс упаковки/распаковки текущего архива и переходил к следующему. Это раздражало, т.к. приходилось клацать Ctrl+C, пока архивы не закончатся. Я почему-то считал, что решить эту проблему будет стоить немалой крови — и я ошибался. В bash есть ловушки (traps), о которых и рассказать-то особо нечего — они просто выполняют команду при поступлении сигнала. Например, я дописал в начало скриптов такую строку:
trap "exit 3" HUP INT TERM
Это значит, что при получении SIGTERM
, SIGINT
или SIGHUP
мой скрипт сразу же сделает exit 3
, т.е. завершится с кодом выхода 3. Легко, понятно, эффективно.
Приятного кодинга!
Comments (migrated from Blogger)
On 2010-01-19T16:11:17.019+02:00, Анонимный wrote:
Аутентификации по openid не работает (по крайней мере – на myopenid.com). Впрочем, это не Ваша вина, скорее всего, а движка.
On 2010-01-23T14:36:42.587+02:00, Minoru wrote:
2 Анонимный:
KILL невозможно перехватить в процессе. man 7 signal.
Не знал. Не нашёл в упомянутом мане такой информации, может, процитируете? Тем не менее, эксперимент подтверждает Ваши слова.
О stty и прочем писать не хочу, т.к. и сам-то не разбираюсь. Пусть уж лучше народ прочтёт Ваш комментарий и поинтересуется сам.
Что касается OpenID — это довольно известная проблема Blogger'а. Гугловцы почему-то не фиксят… :(On 2010-01-24T20:00:14.352+02:00, Kirikaza wrote:
Насчёт перехвата KILL…
Вообще с сигналами можно делать одну из трёх вещей: перехватить, блокировать и игнорировать. Перехват как раз осуществляется в данном примере, блокировка откладывает сигнал "на будущее", а игнор забивает на сигнал. Но можно с сигналами вообще ничего не делать, тогда ядро выполнит действие по умолчанию.
Для каждого сигнала жёстко задано, что с ним можно делать. Для мягкого завершения процесс есть TERM, который можно блокировать, чтобы программа смогла сохранить данные. Для жёсткого завершения – KILL, который блокировать нельзя и все данные программы теряются. При выключении GNU/Linux можно увидеть сообщения, из которых ясно, что сперва всем процессам рассылаются сигналы TERM, а затем самым упорным из них – KILL.
По просьбам трудящихся цитата из man 7 signal: "The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored."
P.S.: Вообще говоря, сигнал KILL в принципе не доходит до процесса – ядро отбирает у процесса все ресурсы, в том числе и процессорное время, так что процесс уже работать не может и становится зомби.
P.P.S.: Крайне рекомендую книгу "Немет Э., Снайдер Г., Сибасс С., Хейн Т. Р. UNIX: руководство системного администратора". У самого под рукой всегда третье издание. Есть ещё вариант для Linux почти тех же авторов – Руководство администратора LinuxOn 2010-01-25T00:27:28.348+02:00, Minoru wrote:
Kirikaza, спасибо за мини-лекцию! Я, признаться, совершенно не интересовался механизмом работы сигналов, а в man 7 signal основное внимание уделил таблице, а не тексту.
За рекомендации спасибо — но я пока не настолько глубоко интересуюсь работой nix, чтобы их читать :)On 2010-03-02T04:00:15.353+02:00, NucleoFag wrote:
Идея решения чем-то напиминает пропускание фильтром через yes для собственно ответа "y" (yes) на какие-либо вопросы)
Your thoughts are welcome by email
(here’s why my blog doesn’t have a comments form)
On 2010-01-19T16:09:57.419+02:00, Анонимный wrote:
KILL невозможно перехватить в процессе. man 7 signal.
Также будет полезно раскрыть тему о том, что в комбинации ctrl-c нет ничего магического: просто так по умолчанию настроен терминальный драйвер – он генерирует SIGINT (man stty, man tefminfo).