我有一个用于测试命令行应用程序的函数。它使用 Node.js child_process.exec 来运行 shell 命令,如下所示:
const proc = child_process.exec(command, { env, timeout }, (error) =>
errorHandler(error)
);
然后,我会监听来自
proc.stdout
的事件,并通过写信给 proc.stdin
来响应提示。我想通过编写代表 CTRL + C 的 ASCII 字符将 SIGINT 信号传递给子进程,以优雅地停止该进程。我尝试过“^C”和“\x03”,但它们不起作用。但是,通过管道将这些字符传递给命令是可行的:
child_process.exec(`printf '^C' | command`);
这两种方法有什么区别?为什么写入标准输入不起作用而管道却起作用?
注意!我在 Ubuntu 中使用默认的 /bin/sh (dash)。这两种方法都不适用于 Windows。
问题在于,文本
^C
并没有终止任何内容,它实际上毫无意义。
杀死进程的是发送
SIGINT
信号。现在,在终端中,CTRL+C
或^C
是发送SIGINT
信号的快捷方式,但是,您所做的只是发送文本。
如果你想正确终止进程,你必须发送
SIGINT
信号。您可以使用此代码来做到这一点child_process.kill('SIGINT');