1

有一个名为 mimosa 的 nodejs 脚本(https://github.com/dbashford/mimosa

Nodejs使用USR1将运行进程切换到调试模式

这是我手动操作的方法

$ cd myproj
$ mimosa watch -s # this runs node /path/to/mimosa watch -s
22:16:03 - Watching /Users/admin/Work/test-mimosa/assets
... # some more output
# check the pid from a different terminal
$ ps aux | grep mimosa
admin          79284   0.7  0.8  3153812 129272 s006  S+   10:16PM   0:03.57 node /opt/local/bin/mimosa watch -s
# send debug signal from the 2nd terminal
kill -s USR1 79284
# nodejs output in the 1st terminal
Hit SIGUSR1 - starting debugger agent.
debugger listening on port 5858

如果我将 mimosa 作为后台进程运行,则同样有效(mimosa watch -s &

现在我需要自动化这个过程:运行 mimosa,获取它的 pid,发送 USR1,等待用户的 SIGTERM,杀死 mimosa:

mimosa watch -s &
pid=$!

echo "mimosa pid: $pid"

trap "echo '\nSTOP'; kill $pid; exit" SIGHUP SIGINT SIGTERM

echo 'send debug'
kill -s USR1 $pid

wait $pid

该脚本立即退出,mimosa 进程也立即退出(我再次使用 grep 检查它)。控制台中的输出

$ ./debug.sh
mimosa pid: 79516
send debug
./debug.sh: line 11: 79516 User defined signal 1: 30 mimosa watch -s

怎么了,怎么解决?

4

1 回答 1

1

当您发送调试信号时,含羞草是否会向其自己的进程组发送信号?这样就可以解释了。

在交互式 shell 中,doing./program使用自己的进程组启动程序。如果程序执行类似的操作kill -s USR1 0,它将永远不会退出该组。

在非交互式 shell / 脚本中,doing./program会将其作为子进程启动,但在同一个进程组中。如果孩子这样做kill -s USR1 0,它将杀死调用脚本。

如果这些是含羞草发送的信号,trap 'echo ignoring' USR1 USR2您可以这样做。debug.sh

set -m或者,尝试在启动 mimosa 之前打开作业控制。

另请参阅我的调用脚本中有“trap 'echo ignore' USR1”,为什么调用脚本会被杀死?

于 2014-02-20T13:15:05.287 回答