脚本启动的进程未收到 SIGINT

脚本启动的进程未收到 SIGINT

我使用的是 Ubuntu 16.04.5 LTS (AWS)

我正在通过以下命令创建一个 python 进程: nohup python -u main.py > nohup.out 2>&1 &

我想向进程发送 ctrl-c/SIGINT,所以我发送kill -2 <pid>.

当我从终端启动该进程时,效果很好,程序接收键盘中断并正常关闭。

.sh当我通过脚本或另一个 bash 进程(例如)启动该进程时bash -c 'nohup python -u main.py > nohup.out 2>&1 &'。 (我相信这两种方法都以相同的方式启动进程),当我发送它时,进程没有收到SIGINT。

SIGTERM (默认kill)正常工作并关闭进程,但不会让进程正常关闭,但我需要。

发生了什么?

答案1

不,它们的开始方式不同。由于 bash 在作业控制关闭的情况下运行脚本,因此命令的后台模式以& 从脚本只是通过让他们忽略 SIGINT 和 SIGQUIT 并将他们的输入重定向到/dev/null.

看我的回答此处(参考描述这一点的标准)。

在您的情况下,这也意味着main.py没有设置任何处理程序来SIGINT执行“优雅”退出,但它只是被 Control-C 或kill -2从交互式 shell 运行时强制终止。如果它确实设置了一个处理程序,那么当从脚本运行时,该处理程序也会覆盖父 shellSIG_IGN的设置处理。SIGINT

相关内容