如何在不终止脚本的情况下终止 bash 脚本中的 运行 进程?

How do you kill a running process in a bashscript without killing the script?

如何在不终止脚本的情况下终止 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);
    }
}

如果您在脚本 运行ning 所在的终端键入 control-C,信号将发送到所有进程 - 记录器程序和脚本。并且脚本终止,因为您没有告诉它在记录器 运行 时忽略信号。您也可以使用 trap command but you'll need to undo the trapping before running the C program. See the Bash manual on Signals 来做到这一点。

例如,我有一个生成消息的程序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"

sub-shell 是必须的。当我 运行 该脚本 (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 为 syslog 守护进程定义了一个命令 logger that writes messages using the syslog() 函数。

可能还值得查看关于 的问答,尤其是接受的答案及其在其他 Stack Exchange 站点上的问答链接,因为重要的是你和我都执行了 C 程序,而不是shell 脚本。