Как убить запущенный процесс в bashscript, не убивая скрипт?
Как убить запущенный процесс в сценарии bash, не убивая сценарий?
Цель
Итак ... мне нужно убить запущенный процесс, чтобы продолжить выполнение моего скрипта.
Вот урезанная версия моего сценария:
# Setup
echo "Use ctrl+C to stop gathering data..."
./logger
#------------------
echo "Rest..."
Мне нужно убить ./logger, не убивая свой скрипт
Ожидаемые и фактические результаты
Я ожидал такого результата:
Use ctrl+C to stop gathering data...
^C
Rest...
но он останавливается, когда я убиваю программу
use ctrl+C to stop gathering data...
^C
Команда ./loggerпредставляет собой программу на языке C, которая уже обрабатывает SIGINTсигнал ( Ctrl + C), но не остановится, пока не получит его. Есть ли способ остановить программу, не убивая мой скрипт?
Программа C не важна, но выглядит примерно так
#include <stdio.h>
#include <signal.h>
int flag = 1;
void handler(int i)
{
flag = 0;
}
int main(int argc, char** argv)
{
signal(SIGINT, handler);
while(flag)
{
usleep(10000);
}
}
Ответы
Если вы наберете control-C на терминале, на котором запущен скрипт, сигнал поступит во все процессы - программу-регистратор и скрипт. И сценарий завершается, потому что вы не сказали ему игнорировать сигналы во время работы регистратора. Вы можете сделать это с помощью trapкоманды, но вам нужно будет отменить захват перед запуском программы C. См. Также руководство Bash по сигналам .
Например, у меня есть программа, dribblerкоторая генерирует сообщения, по умолчанию одно каждую секунду, но ее можно настроить. Я использую его как суррогат для вашей ./loggerпрограммы. Параметры -mопределяют сообщение; то -nзапросы опционных , что сообщения пронумерованные, а -tопция определяет выход на стандартный вывод (вместо файла , который он записывает в по умолчанию).
#!/bin/bash
#
# SO 6418-0134
program="dribbler -t -n -m Hello"
echo "About to run '$program' command" trap "" 2 (trap 2; $program)
echo "Continuing after '$program' exits"
sleep 1
echo "But not for long"
Подоболочка необходима. Когда я запускаю этот скрипт ( trapper.sh), я получаю, например:
$ bash trapper.sh
About to run 'dribbler -t -n -m Hello' command
0: Hello
1: Hello
2: Hello
3: Hello
^CContinuing after 'dribbler -t -n -m Hello' exits
But not for long
$
Между прочим, POSIX определяет команду, loggerкоторая записывает сообщения с помощью syslog()функции (функций) в syslogдемон.
Также, возможно, стоит просмотреть вопросы и ответы об отправке SIGINT разветвленному процессу exec, который запускает скрипт, не убивает его , особенно принятый ответ и его ссылки на вопросы и ответы на других сайтах Stack Exchange, так как важно, что вы и я оба выполнили C программа, а не сценарий оболочки.