Перейти к содержимому

Как остановить скрипт в linux

  • автор:

Как прервать выполнение процесса в скрипте

Как прервать выполнение процесса в скрипте, как по Ctrl+C ?

anonymous
28.06.04 01:33:54 MSD

Re: Как прервать выполнение процесса в скрипте

man 1 kill если надо точно также как по Ctrl+C, то по этому сочетанию процессу посылаеться сигнал SIGINT, тоесть сигнал №3 Тогда соответственно или

kill -SIGINT $PID

где $PID номер процесса

А еще более правильно

kill -SIGINT -$GID

то есть группе процессов, так как Ctrl+C посылает сигнал не одному процессу,а группе

anonymous
( 28.06.04 01:58:17 MSD )
Ответ на: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 01:58:17 MSD

Re: Re: Как прервать выполнение процесса в скрипте

Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока он не остановиться, невозможно выполнить следующую команду. Как его остановить?

anonymous
( 28.06.04 13:12:07 MSD )
Ответ на: Re: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 13:12:07 MSD

Re: Re: Re: Как прервать выполнение процесса в скрипте

Поправлюсь:
Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?

anonymous
( 28.06.04 13:13:39 MSD )
Ответ на: Re: Re: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 13:13:39 MSD

Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

> Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?

А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать «как по ^C» собрался)?

Die-Hard ★★★★★
( 28.06.04 13:54:41 MSD )
Ответ на: Re: Re: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 13:13:39 MSD

Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

Запускай процесс в фоне 🙂

а потом если захочешь его убить

anonymous
( 28.06.04 15:12:33 MSD )

Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

>>А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать «как по ^C» собрался)?

Чего то меня последнее время напрягаю вопросы типа «А зачем»

Может ему этот процесс надо на пару секунд

anonymous
( 28.06.04 15:54:26 MSD )

Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

> Чего то меня последнее время напрягаю вопросы типа «А зачем» Может ему этот процесс надо на пару секунд

А в твоем примере PID=$1 или PID=$! ?

А kill -9 или kill -2 (SIGINT)?

А твоя фамилия не Ностердамус?

Die-Hard ★★★★★
( 28.06.04 16:11:12 MSD )

Re: Как прервать выполнение процесса в скрипте

форкнуться на два процесса парент-чайлд, потом следить по таймаутам, например, чего и как. Или сделать 2 канала (парент-чайлд и чайлд-парент) между процессами для обмена информацией.

vilfred ☆☆
( 28.06.04 16:47:05 MSD )
Ответ на: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 01:58:17 MSD

Re: Re: Как прервать выполнение процесса в скрипте

Этот процесс не работает в фоне. 🙁

anonymous
( 28.06.04 17:00:58 MSD )
Ответ на: Re: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 17:00:58 MSD

Re: Re: Re: Как прервать выполнение процесса в скрипте

>>Этот процесс не работает в фоне. 🙁

Он читает что-то с терминала?

anonymous
( 28.06.04 17:04:39 MSD )

Re: Как прервать выполнение процесса в скрипте

Ты что, издеваешься, или решил в «Что?Где?Когда?» поиграть?

Сформулируй, наконец, свой вопрос.

Die-Hard ★★★★★
( 28.06.04 17:23:25 MSD )
Ответ на: Re: Как прервать выполнение процесса в скрипте от Die-Hard 28.06.04 17:23:25 MSD

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.

anonymous
( 28.06.04 19:21:28 MSD )
Ответ на: Re: Re: Как прервать выполнение процесса в скрипте от anonymous 28.06.04 19:21:28 MSD

Re: Re: Re: Как прервать выполнение процесса в скрипте

>>No togda kill ub’et _VSE_ processy gde budet vstrechat’sya imya tvoego processa.

Ну тогда сразу killall -9 my_process, чего мелочиться!! 😉

Кстати, никто не пробывал посылать из под рута SIGKILL иниту?

Nesk
( 28.06.04 19:49:44 MSD )
Ответ на: Re: Re: Re: Как прервать выполнение процесса в скрипте от Nesk 28.06.04 19:49:44 MSD

Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

Nesk (*) (28.06.2004 19:49:44):

> Кстати, никто не пробывал посылать из под рута SIGKILL иниту?

Стандартный вопрос «на засыпку» 🙂

Можешь смело посылать, ничего не будет: init не имеет обработчиков сигналов.

Die-Hard ★★★★★
( 28.06.04 20:10:02 MSD )

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;

idle ★★★★★
( 28.06.04 20:46:46 MSD )

Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

2idle (*) (28.06.2004 20:46:46):

Странно. Может, это — новый Деним Торнадо Автешейв?

У меня в 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.

Die-Hard ★★★★★
( 28.06.04 23:06:20 MSD )
Ответ на: Re: Как прервать выполнение процесса в скрипте от Die-Hard 28.06.04 17:23:25 MSD

Re: Re: Как прервать выполнение процесса в скрипте

Спасибо всем, вроде немного разобрался.

anonymous
( 28.06.04 23:48:09 MSD )

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

idle ★★★★★
( 29.06.04 12:43:48 MSD )

Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

> послать можно, но доставлен он не будет. точнее, он даже будет доставлен в том смысле, что init будет прерван/разбужен, но SIG_DFL, повторю, превращается в SIG_IGN.

idle ★★★★★
( 29.06.04 14:39:38 MSD )

Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте

idle (*) (29.06.2004 12:43:48):

>собственно, что я придрался к тому, что:

>> 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. */

if (current->pid == 1)

Наверное, это и имеется в виду: init имеет только те обработчики, которые САМ выставил.

>> Странно. Может, это — новый Деним Торнадо Автешейв?

> а что это такое?

Бессмертные строчки из рекламы лосьона посте бритья!

Как использовать коды завершения в Bash-скриптах

Как использовать коды завершения в Bash-скриптах главное изображение

Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Что такое коды завершения

В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.

Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.

Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.

Что происходит, когда коды завершения не определены

В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.

#!/bin/bash touch /root/test echo created file 

Этот скрипт запускает команды touch и echo . Если запустить этот скрипт без прав суперпользователя, команда touch не выполнится. В этот момент мы хотели бы получить информацию об ошибке с помощью соответствующего кода завершения. Чтобы проверить код выхода, достаточно ввести в командную строку специальную переменную $? . Она печатает код возврата последней запущенной команды.

Как видно, после запуска команды ./tmp.sh получаем код завершения 0 . Этот код говорит об успешном выполнении команды, хотя на самом деле команда не выполнилась. Скрипт из примера выше исполняет две команды: touch и echo . Поскольку код завершения не определён, получаем код выхода последней запущенной команды. Это команда echo , которая успешно выполнилась.

#!/bin/bash touch /root/test 

Если убрать из скрипта команду echo , можно получить код завершения команды touch .

Поскольку touch в данном случае — последняя запущенная команда, и она не выполнилась, получаем код возврата 1 .

Как использовать коды завершения в Bash-скриптах

Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch ? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.

Проверяем коды завершения

Выше мы пользовались специальной переменной $? , чтобы получить код завершения скрипта. Также с помощью этой переменной можно проверить, выполнилась ли команда touch успешно.

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" else echo "Could not create file" >&2 fi 

После рефакторинга скрипта получаем такое поведение:

  • Если команда touch выполняется с кодом 0 , скрипт с помощью echo сообщает об успешно созданном файле.
  • Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.

Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr .

Создаём собственный код завершения

Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0 .

Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit .

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo "Successfully created file" exit 0 else echo "Could not create file" >&2 exit 1 fi 

Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0 . В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1 .

Как использовать коды завершения в командной строке

Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.

В примере выше && используется для обозначения «и», а || для обозначения «или». В данном случае команда выполняет скрипт ./tmp.sh , а затем выполняет echo «bam» , если код завершения 0 . Если код завершения 1 , выполняется следующая команда в круглых скобках. Как видно, в скобках для группировки команд снова используются && и || .

Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.

Дополнительные коды завершения

Команда exit принимает числа от 0 до 255 . В большинстве случаев можно обойтись кодами 0 и 1 . Однако есть зарезервированные коды, которые обозначают конкретные ошибки. Список зарезервированных кодов можно посмотреть в документации .

Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.

Бесплатные курсы по программированию в Хекслете

  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки

Как остановить процесс в shell скрипте?

Мне нужно написать shell-скрипт. Его суть сводится к цикличной загрузке модуля драйвера, запуска тестового приложения, если приложение не упало в течении трех секунд, остановки его и последующей выгрузки драйвера. Пока что написал следующее:

#!/bin/sh for((i=0; i log & sleep 3 kill pid rmmod mali rmmod ump done 

Как я понимаю, нужно воспользоваться командой kill, но как передать ей id процесса? Ну, т.е. нужно «грепнуть» jobs -l по имени процесса, но grep ведь вернет строчку, а не число.

Отслеживать
Андрей Солодовников
задан 5 апр 2018 в 13:09
Андрей Солодовников Андрей Солодовников
718 5 5 серебряных знаков 23 23 бронзовых знака

grep ведь вернет строчку, а не число вот эту строку и передавай в kill. У тебя в скрипте все абы числа — они строки (да и весь скрипт — сплошь текст), и ничего.

5 апр 2018 в 13:18

под «строчкой, а не числом», я имел ввиду не различие в концепциях string и int, а в том, что в этой строке будет еще много разного мусора: [3]+ 233 Stopped ./cube 1>&log из которого мне нужно только число 233.

5 апр 2018 в 13:29

А еще есть команда killall которая в качестве параметра принимает как раз имя процесса. killall cube должен помочь

5 апр 2018 в 13:33

@Mike, Боже, почитайте документацию что ли. $! после запуска будет содержать PID. И никогда не используйте killall в скриптах.

6 апр 2018 в 8:02

пробовали: timeout 3s cube &>log (что остановит cube после 3 секунд, но может раньше вернуться, если cube раньше завершится)

Как остановить скрипт в linux

Запись: and-semakin/mytetra_data/master/base/15910840983lhxkf8phh/text.html на raw.githubusercontent.com

В bash есть команда, которая позволяет завершить выполнение скрипта с опциональным кодом выхода.

По умолчанию код выхода берется из предыдущей перед exit команды:

# Will exit with status of last command.

Можно передавать явно:

exit 0 # success

exit 113 # some specific error

  • Выполнить несколько команд и завершиться ошибкой при хотя бы одной ошибке в скрипте Bash
  • Узнать директорию, в которой расположен текущий скрипт в bash
  • Экспортировать переменную окружения перманентно в bash
  • Сохранять историю команд bash из нескольких терминалов одновременно
  • Перенаправление вывода в bash в Linux
  • Записать несколько строк из bash в файл в Linux
  • Запустить соседний скрипт, лежащий в той же директории, в bash
  • Проверить, что переменная пуста или не существует в bash
  • Завершить (выйти) скрипт с кодом ошибки (выхода) в bash
  • Переименовать все файлы в директории однообразно при помощи bash
  • Распарсить .env (dotenv) файл в bash напрямую
  • Настроить приветствие терминала (prompt) в bash

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *