LINUX.ORG.RU

bash. завершение скрипта по Ctrl+C


0

2

доброго вечера.

есть некоторый скрипт, который, в цикле выполняет wget. если требуется прервать работу скрипта, жму Ctrl+C. но это только прерывает текущий wget. далее запускается следующий.

подскажите, как прибить скрипт и все процессы в нем выполняющиеся?

спасибо.

★★★

Нажми и держи.

imul ★★★★★
()

Заведи обработчик и завершай скрипт.

gman
()

Кстати, не знаю, что у вас там за система, у меня зацикленный в скрипте wget запросто прибился одним Ctrl+C

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Т.е. выполнение всего скрипта остановилось, да

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

У меня, если wget закачивает, то он по Ctrl+C завершается, но цикл не прерывается.

gman
()
Ответ на: комментарий от kostik87

Твой совет сродни тому, что я описал.

Это чем же он сродни? Вполне нормальный совет, я считаю, в отличие от твоих про reset и провод. Если что, при запуске скрипта будет запущен bash, интерпретирующий скрипт, который (bash) будет дочерним процессом того bash'а, который интерактивный. Вот дочерний процесс и надо прибить (это и просит ТС). Мне кажется, ты подумал, что yoghurt имеет ввиду прибить интерактивный bash (родительский) — это не так.

gentoo_root ★★★★★
()
Ответ на: комментарий от helios

kill конечно подойдет. но можно как-то его заставить килать скрипт, не выясняя PID и не лазая в другую консоль? т.е. чтоб он прибивал процесс завладевший(эпически получилось) консолью в данный момент?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Можно, конечно, перехватывать сигналы, после чего рассылать всем «друзьям» просьбу «убиться о стену». Но в данном случае это не лучший способ. Ctrl+C посылает сигнал foreground группе процессов. Раз у тебя он убивает только wget... Короче, лечге всё это сделать через kill. Можно процесс убивать тоже ч/з killall, но тогда надо знать как он запущен и т.д. Если это «кустарное» производство - глянь в ps aux как называется процесс и убивай его через killall.

helios ★★★★★
()
Ответ на: комментарий от anonymous

а что по-твоему делает cntrl+c ? оно послылает sigkill

Не-а, оно посылает SIGINT.

gentoo_root ★★★★★
()
Ответ на: комментарий от niXman

изнутри скрипта, на Ctrl+C можно посадить kill?

Делаешь trap на SIGINT, в котором ‘kill $$’. $$ будет заменён на pid интерпретатора.

gentoo_root ★★★★★
()
Ответ на: комментарий от OldFatMan

oh shi, конечно же ты прав, старый и толстый

zolden ★★★★★
()

У меня есть довольно приятное решение с помощью screen. Я создаю поток с фиксированной меткой, сразу в detach режиме. Могу поделиться start, stop и status скриптами, правда, они тривиальны и man screen вполне достаточно.

observer ★★★
()

есть некоторый скрипт, который, в цикле выполняет wget. если требуется прервать работу скрипта, жму Ctrl+C. но это только прерывает текущий wget. далее запускается следующий. подскажите, как прибить скрипт и все процессы в нем выполняющиеся?

1. если вы убьёте родителя, то дети сами сдохнут (если их не кормить).

2. когда вы убиваете wget, он возвращает код ошибки 128+номер сигнала. Номера можно посмотреть запустив kill -l, у меня SIGINT == 2. 128+2 == 130. Т.о. скрипт может узнать, что вы решили прервать его работу.

drBatty ★★
()
Ответ на: комментарий от OldFatMan

Абсолютно не про то речь шла. Прочти «цепочку» комментов и поймёшь.

да я вижу, что для решения примитивной задачи вы тут какую-то НЁХ придумываете...

drBatty ★★
()

странно то, что никто не предложил проверять статус завершения wget и исходя из него выполнять exit.

так и поступил. всем спасибо.

niXman ★★★
() автор топика
Ответ на: комментарий от observer

возможно это оно. но я это до сих пор не осознаю.

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.