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

Vic*_*z99 4 c bash shell sh

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

\n

目标

\n

所以...我需要终止正在运行的进程才能继续执行我的脚本。

\n

Here\xc2\xb4s是我的脚本的精简版本:

\n
# Setup\necho "Use ctrl+C to stop gathering data..."\n./logger\n#------------------\necho "Rest..."\n\n
Run Code Online (Sandbox Code Playgroud)\n

我需要能够在不杀死我的脚本的情况下杀死 ./logger

\n

预期结果与实际结果

\n

我期待这样的结果:

\n
Use ctrl+C to stop gathering data...\n^C\nRest...\n
Run Code Online (Sandbox Code Playgroud)\n

但当我杀死程序时它就会停止

\n
use ctrl+C to stop gathering data...\n^C\n
Run Code Online (Sandbox Code Playgroud)\n

./logger命令是一个 C 程序,它已经处理了SIGINT信号 ( Ctrl + C),但在收到信号之前它不会停止。\n有没有办法在不终止我的脚本的情况下停止该程序?

\n

C 程序并不重要,但它看起来像这样

\n
#include <stdio.h>\n#include <signal.h>\n\nint flag = 1;\n\nvoid handler(int i)\n{\n     flag = 0;\n}\n\nint main(int argc, char** argv)\n{\n    signal(SIGINT, handler);\n    while(flag)\n    {\n       usleep(10000);\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

Jon*_*ler 5

如果您在运行脚本的终端键入 control-C,信号将发送至所有进程 \xe2\x80\x94、记录器程序和脚本。并且脚本终止,因为您没有告诉它在记录器运行时忽略信号。您可以使用该trap命令来执行此操作,但需要在运行 C 程序之前撤消捕获。请参阅 Bash 手册另请参阅有关信号

\n

例如,我有一个dribbler生成消息的程序,默认情况下每秒生成一条消息,但它是可配置的。我用它作为你的./logger程序的替代品。选项-m指定消息;该-n选项要求对消息进行编号,并且-t选项指定输出到标准输出(而不是默认写入的文件)。

\n
#!/bin/bash\n#\n# SO 6418-0134\n\nprogram="dribbler -t -n -m Hello"\necho "About to run \'$program\' command"\n\ntrap "" 2\n(trap 2; $program)\n\necho "Continuing after \'$program\' exits"\nsleep 1\necho "But not for long"\n
Run Code Online (Sandbox Code Playgroud)\n

子外壳是必要的。当我运行该脚本时(trapper.sh ) 时,我得到,例如:

\n
#!/bin/bash\n#\n# SO 6418-0134\n\nprogram="dribbler -t -n -m Hello"\necho "About to run \'$program\' command"\n\ntrap "" 2\n(trap 2; $program)\n\necho "Continuing after \'$program\' exits"\nsleep 1\necho "But not for long"\n
Run Code Online (Sandbox Code Playgroud)\n

顺便说一句,POSIX 定义了一个logger使用函数将消息写入syslog()syslog命令。

\n

还可能值得回顾一下有关将 SIGINT 发送到运行脚本的分叉 exec 进程的问答,该进程不会杀死它,尤其是接受的答案及其到其他 Stack Exchange 站点上的问答的链接,因为重要的是你和我都执行了 C程序,而不是 shell 脚本。

\n