我正在开发一个 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+时C,python
会正常退出,但 shell 会继续执行脚本的其余清理命令。第二个命令trap - INT
不是严格必需的,它使您可以再次使用Ctrl+C来停止清理过程。也就是说,如果您发送 SIGINT 到memcache_stop
,shell 不会尝试执行mongodb_stop
,而是直接退出。
这里一篇详细的文章描述了 shell 如何处理 SIGINT/SIGQUIT。