使用 SIGINT 中断 bash 脚本

使用 SIGINT 中断 bash 脚本

你好,我有一个 bash 脚本,它是用于执行一段长时间运行的 C++ 代码的一行程序。运行ps -xaf脚本就是运行,而 C++ 代码是它的子程序

script.sh
\_ long_main.cpp

当我从命令行运行代码并按下 ctrl+C 时,bash 脚本和 c++ 代码会被中断并停止执行。我喜欢这个。

但是,当我运行脚本并对脚本执行 kill -SIGINT PID 时,脚本会终止,而 C++ 代码会继续运行。运行时,ps -xaf我发现 sh 脚本确实终止了,但 C++ 代码仍在自行运行,现在它是一个顶级进程,如下所示:

long_main.cpp

您能详细说明一下在这种情况下 CRTL+C 和 kill -SIGINT 之间的区别吗?

答案1

如果相关 shell 脚本仅包含一个调用外部程序的命令,则可以在该命令前面加上execto代替shell 进程,而不是生成新进程。例如更改

/path/to/my-program "$@"

exec /path/to/my-program "$@"

由于my-program现在替换了 shell 进程,因此它保留了其 PID 并接收发送给它的所有信号按 PID包括 SIGINT。显然,您不能再根据 shell 脚本的名称或命令行向其发送信号。

相关内容