Как убить запущенный процесс в bashscript, не убивая скрипт?

Oct 03 2020

Как убить запущенный процесс в сценарии 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);
    }
}

Ответы

4 JonathanLeffler Oct 03 2020 at 10:21

Если вы наберете 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 программа, а не сценарий оболочки.