我可以让子进程中的 Ctrl-C 在父进程中执行某些操作吗?

我可以让子进程中的 Ctrl-C 在父进程中执行某些操作吗?

我正在开发一个 Web 应用程序memcache,该应用程序使用mongodb 等以及python基于 Web 框架。python需要位于前台,以便我可以看到控制台输出,或者根据需要输入调试器。

目前我有一个start.sh

memcache_start
mongodb_start
python fg

stop.sh

memcache_stop
mongodb_stop

脚本可以使一切自动化。

python通常我使用- 杀死 fg 中的Ctrl-C这会杀死python.现在我需要显式运行stop.sh来正常关闭系统。

start.sh 是否可以知道Ctrl-C SIGINT以便我也可以执行停止命令,因为它在逻辑上是必须执行的下一个连续操作?

答案1

在运行 python 之前使用trap ' ' INT告诉 shell 忽略 SIGINT,trap - INT然后恢复默认行为:

memcache_start
mongodb_start
trap ' ' INT
python fg
trap - INT
memcache_stop
mongodb_stop

在该trap ' ' INT行之后,shell 被指示忽略 SIGINT,但python不受此影响。因此,当您点击Ctrl+时Cpython会正常退出,但 shell 会继续执行脚本的其余清理命令。第二个命令trap - INT不是严格必需的,它使您可以再次使用Ctrl+C来停止清理过程。也就是说,如果您发送 SIGINT 到memcache_stop,shell 不会尝试执行mongodb_stop,而是直接退出。

这里一篇详细的文章描述了 shell 如何处理 SIGINT/SIGQUIT。

相关内容