- Как прервать выполнение процесса в скрипте
- Re: Как прервать выполнение процесса в скрипте
- Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Как прервать выполнение процесса в скрипте
- Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Как прервать выполнение процесса в скрипте
- Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
- Команда exit в Bash и коды выхода
- Статус выхода
- Команда exit
- Примеры
- Выводы
Как прервать выполнение процесса в скрипте
Как прервать выполнение процесса в скрипте, как по Ctrl+C ?
Re: Как прервать выполнение процесса в скрипте
man 1 kill если надо точно также как по Ctrl+C, то по этому сочетанию процессу посылаеться сигнал SIGINT, тоесть сигнал №3 Тогда соответственно или
то есть группе процессов, так как Ctrl+C посылает сигнал не одному процессу,а группе
Re: Re: Как прервать выполнение процесса в скрипте
Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока он не остановиться, невозможно выполнить следующую команду. Как его остановить?
Re: Re: Re: Как прервать выполнение процесса в скрипте
Поправлюсь:
Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?
А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать «как по ^C» собрался)?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
а потом если захочешь его убить
Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
>>А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать «как по ^C» собрался)?
Чего то меня последнее время напрягаю вопросы типа «А зачем»
Может ему этот процесс надо на пару секунд
Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Чего то меня последнее время напрягаю вопросы типа «А зачем» Может ему этот процесс надо на пару секунд
А в твоем примере PID=$1 или PID=$! ?
А kill -9 или kill -2 (SIGINT)?
А твоя фамилия не Ностердамус?
Re: Как прервать выполнение процесса в скрипте
форкнуться на два процесса парент-чайлд, потом следить по таймаутам, например, чего и как. Или сделать 2 канала (парент-чайлд и чайлд-парент) между процессами для обмена информацией.
Re: Re: Как прервать выполнение процесса в скрипте
Этот процесс не работает в фоне. 🙁
Re: Re: Re: Как прервать выполнение процесса в скрипте
>>Этот процесс не работает в фоне. 🙁
Он читает что-то с терминала?
Re: Как прервать выполнение процесса в скрипте
Ты что, издеваешься, или решил в «Что?Где?Когда?» поиграть?
Сформулируй, наконец, свой вопрос.
Re: Re: Как прервать выполнение процесса в скрипте
Togda esli znaesh kak on budet nazyvat'sya mozhno sdelat' tak: #/bin/tcsh sleep 2; kill -9 `ps aux | grep my_process | awk ` & my_process No togda kill ub'et _VSE_ processy gde budet vstrechat'sya imya tvoego processa.
Re: Re: Re: Как прервать выполнение процесса в скрипте
>>No togda kill ub’et _VSE_ processy gde budet vstrechat’sya imya tvoego processa.
Ну тогда сразу killall -9 my_process, чего мелочиться!! 😉
Кстати, никто не пробывал посылать из под рута SIGKILL иниту?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Кстати, никто не пробывал посылать из под рута SIGKILL иниту?
Стандартный вопрос «на засыпку» 🙂
Можешь смело посылать, ничего не будет: init не имеет обработчиков сигналов.
Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> init не имеет обработчиков сигналов. сорри, чувствую себя полным занудой, но не могу не поправить :) у init'а есть обработчики сигналов, но -9 его действительно не потревожит. потому, что в linux для процесса с pid == 1 SIG_DFL означает SIG_IGN. см kernel/signal.c:get_signal_to_deliver() вот эти строчки: /* Init gets no signals it doesn't want. */ if (current->pid == 1) continue;
Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Странно. Может, это — новый Деним Торнадо Автешейв?
У меня в linux-2.4.19.SuSE/kernel/ никакого упоминания о get_signal_to_deliver не содержится.
С другой стороны, man 2 kill:
It is impossible to send a signal to task number one, the init process, for which it has not installed a signal handler. This is done to assure the system is not brought down accidentally.
Re: Re: Как прервать выполнение процесса в скрипте
Спасибо всем, вроде немного разобрался.
Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Странно. Может, это -- новый Деним Торнадо Автешейв? а что это такое? > У меня в linux-2.4.19.SuSE/kernel/ никакого упоминания > о get_signal_to_deliver не содержится. это в 2.6, в 2.4 это в arch/i386/kernel/signal.c:do_signal(): if (ka->sa.sa_handler == SIG_DFL) < /* Init gets no signals it doesn't want. */ if (current->pid == 1) continue; > It is impossible to send a signal to task number one, the > init process, for which it has not installed a signal handler. послать можно, но доставлен он не будет. ~$ perl -e 'kill 9, 1 or die "$!\n"' Operation not permitted ~$ su - Password: ~# perl -e 'kill 9, 1 or die "$!\n"' ~# собственно, что я придрался к тому, что: > init не имеет обработчиков сигналов. он, конечно, имеет. как минимум, SIGCHLD
Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> послать можно, но доставлен он не будет. точнее, он даже будет доставлен в том смысле, что init будет прерван/разбужен, но SIG_DFL, повторю, превращается в SIG_IGN.
Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
>собственно, что я придрался к тому, что:
>> init не имеет обработчиков сигналов.
Ну, я никогда в ядро на эту тему не лазил, просто верил цитированным строчкам из мануала:
> . for which it has not installed a signal handler.
Чой-то я не могу найти исходников init’а.
Из ядерного кода я понял только, что в ините не выставляются обработчики по умолчанию:
if (ka->sa.sa_handler == SIG_DFL)
/* Init gets no signals it doesn’t want. */
Наверное, это и имеется в виду: init имеет только те обработчики, которые САМ выставил.
>> Странно. Может, это — новый Деним Торнадо Автешейв?
Бессмертные строчки из рекламы лосьона посте бритья!
Команда exit в Bash и коды выхода
Часто при написании сценариев Bash вам необходимо завершить сценарий при выполнении определенного условия или выполнить действие на основе кода выхода команды.
В этой статье мы рассмотрим встроенную команду exit Bash и статусы выхода выполненных команд.
Статус выхода
Каждая команда оболочки возвращает код выхода, когда она завершается успешно или безуспешно.
По соглашению нулевой код выхода указывает, что команда завершилась успешно, а ненулевое значение означает, что произошла ошибка.
Специальная переменная $? возвращает статус выхода последней выполненной команды:
Команда date завершена успешно, код выхода равен нулю:
Если вы попытаетесь запустить ls в несуществующем каталоге, код выхода будет отличным от нуля:
ls /nonexisting_dir &> /dev/null
echo $?
Код состояния можно использовать для выяснения причины сбоя команды. На странице руководства каждой команды содержится информация о кодах выхода.
При выполнении многокомандного конвейера статус выхода конвейера соответствует состоянию последней команды:
sudo tcpdump -n -l | tee file.out
echo $?
В приведенном выше примере echo $? напечатает код выхода команды tee .
Команда exit
Команда exit закрывает оболочку со статусом N Он имеет следующий синтаксис:
Если N не задано, код состояния выхода — это код последней выполненной команды.
При использовании в сценариях оболочки значение, указанное в качестве аргумента команды exit возвращается оболочке как код выхода.
Примеры
Статус выхода команд может использоваться в условных командах, таких как if . В следующем примере grep завершит работу с нулем (что означает истину в сценариях оболочки), если «строка поиска» найдена в filename :
if grep -q "search-string" filename then echo "String found." else echo "String not found." fi
При запуске списка команд, разделенных && (И) или || (ИЛИ), статус выхода команды определяет, будет ли выполнена следующая команда в списке. Здесь команда mkdir будет выполнена, только если cd вернет ноль:
cd /opt/code && mkdir project
Если сценарий завершается exit без указания параметра, код выхода из сценария — это код последней команды, выполненной в сценарии.
#!/bin/bash echo "doing stuff. " exit
Использование только exit — это то же самое, что и exit $? или пропуская exit .
Вот пример, показывающий, как завершить сценарий, если он запущен пользователем без полномочий root:
#!/bin/bash if [[ "$(whoami)" != root ]]; then echo "Only user root can run this script." exit 1 fi echo "doing stuff. " exit 0
Если вы запустите сценарий как root, код выхода будет нулевым. В противном случае скрипт выйдет со статусом 1 .
Выводы
Каждая команда оболочки возвращает код выхода при завершении. Команда exit используется для выхода из оболочки с заданным статусом.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.