如何在不终止脚本的情况下终止 bash 脚本中正在运行的进程?
\n所以...我需要终止正在运行的进程才能继续执行我的脚本。
\nHere\xc2\xb4s是我的脚本的精简版本:
\n# Setup\necho "Use ctrl+C to stop gathering data..."\n./logger\n#------------------\necho "Rest..."\n\nRun Code Online (Sandbox Code Playgroud)\n我需要能够在不杀死我的脚本的情况下杀死 ./logger
\n我期待这样的结果:
\nUse ctrl+C to stop gathering data...\n^C\nRest...\nRun Code Online (Sandbox Code Playgroud)\n但当我杀死程序时它就会停止
\nuse ctrl+C to stop gathering data...\n^C\nRun Code Online (Sandbox Code Playgroud)\n该./logger命令是一个 C 程序,它已经处理了SIGINT信号 ( Ctrl + C),但在收到信号之前它不会停止。\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\nRun Code Online (Sandbox Code Playgroud)\n
如果您在运行脚本的终端键入 control-C,信号将发送至所有进程 \xe2\x80\x94、记录器程序和脚本。并且脚本终止,因为您没有告诉它在记录器运行时忽略信号。您可以使用该trap命令来执行此操作,但需要在运行 C 程序之前撤消捕获。请参阅 Bash 手册另请参阅有关信号。
例如,我有一个dribbler生成消息的程序,默认情况下每秒生成一条消息,但它是可配置的。我用它作为你的./logger程序的替代品。选项-m指定消息;该-n选项要求对消息进行编号,并且-t选项指定输出到标准输出(而不是默认写入的文件)。
#!/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"\nRun Code Online (Sandbox Code Playgroud)\n子外壳是必要的。当我运行该脚本时(trapper.sh ) 时,我得到,例如:
#!/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"\nRun Code Online (Sandbox Code Playgroud)\n顺便说一句,POSIX 定义了一个logger使用函数将消息写入syslog()到syslog命令。
还可能值得回顾一下有关将 SIGINT 发送到运行脚本的分叉 exec 进程的问答,该进程不会杀死它,尤其是接受的答案及其到其他 Stack Exchange 站点上的问答的链接,因为重要的是你和我都执行了 C程序,而不是 shell 脚本。
\n