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

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

  • автор:

Как остановить процесс в 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

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

Запрет на повторное выполнение скрипта в bash
Добрый день! Как можно запретить выполнятся скрипту, если прошлый его запуск был с ошибкой?

Выполнение локального скрипта на удаленной машине средствами Expect, Bash, SSH
Уважаемые знатоки! Есть задача, выполнить небольшой скрипт на удаленных машинах. Соединение ssh.

Как остановить выполнение команды в терминале?
бесконечно летит трафик, выполнила команду tcpdump, как остановить??

Эксперт по компьютерным сетямЭксперт NIX

12946 / 7348 / 788
Регистрация: 09.09.2009
Сообщений: 28,756

exit

Регистрация: 06.03.2014
Сообщений: 3,066

1 2 3 4
if [ -n "$(ps h -C ffmpeg)" ]; then sudo exit echo "Останавливаем выполнение скрипта" fi

Условие проходит, но выполнение скрипта не останавливается. Система дальше читает код.
Регистрация: 03.05.2020
Сообщений: 50

Лучший ответ

Сообщение было отмечено Gerd199 как решение

Решение

1 2 3 4
if [ -n "$(ps h -C ffmpeg)" ]; then echo "Останавливаем выполнение скрипта" fi exit $?

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Уддаленное выполнение скрипта
QQ Банальный вопрос, но некомпетентность не позволяет решить задачу самостоятельно. Есть 8.

Выполнение скрипта при старте иксов
Написал скрипт для запуска тачпада, поместил его в /etc/init.d ссылку на него в /etc/rc5.d. .

Выполнение скрипта в файле PHP на сервере
Такая ситуация: на сервере лежит файл (к прим. mail.php) почтового сервиса, который делает.

Автоматическое выполнение скрипта при старте Ubuntu
Доброго времени суток. Хочу что бы при старте ubuntu выполнялось несколько команд. добавляю их в.

Как в sudoers добавить выполнение скрипта без ввода пароля?
Здравствуйте. Надо дать юзеру права root на выполнение определённого скрипта. Выполняю: visudo.

Как остановить выполнение скрипта
Я на vds через cron запустил php скрипт который работает безконечно(в цикле), как мне его завершить?

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

Как прервать выполнение процесса в скрипте, как по 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 имеет только те обработчики, которые САМ выставил.

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

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

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

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

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