首页 > 解决方案 > Bash 将 SIGINT 路由到从 Bash 脚本启动的文件/进程

问题描述

我有一个执行 NodeJS 文件的 bash 脚本(startup.sh),这个 javascript 文件侦听 SIGINT 信号。我遇到的问题是,当我通过 startup.sh 运行整个设置然后使用 Control + C 时,这似乎会在 javascript 文件收到信号之前杀死 bash 脚本。

有什么方法可以防止 startup.sh 终止 SIGINT 信号,而是将其路由到 javascript 文件?我一直在尝试使用陷阱和杀死的一些解决方案,但我还没有走得很远。谢谢!

启动.sh

#!/bin/bash
node myFile.js

我的文件.js

process.on("SIGINT", () => {
   console.log("Cleaning up")
   // Do some cleanup work
})

要指定所有内容的当前状态,如果我运行 node myFile.js并发送 SIGINT,一切正常。但是,如果我运行startup.sh然后发送一个 SIGINT 信号,我看不到我假设的“清理”,因为 SIGINT 关闭了 startup.sh 进程,所以 myFile.js 永远不会收到这个信号。

标签: javascriptbashsigint

解决方案


如果您的脚本只是这一行,exec就可以了。alias如果可行,您也可以只使用。

如果您的启动脚本最终会变成一个更大的脚本,您可能只是捕获信号,如下所示:

#!/bin/bash
  
tokill=$$

function no_ctrlc()
{
    echo "Killed the nodejs"
    kill -3 $tokill
    exit
}

trap no_ctrlc SIGINT


node myFile.js &
tokill=$!
wait


推荐阅读