我正在终端上使用 Ink React 构建一个应用程序。我想要一个专用且独立的终端来从主应用程序输出我想要的任何日志。为了做到这一点,我去尝试
"ipc"
函数中的 spawn
stdio 选项:
import { spawn } from "child_process";
import type { ChildProcess } from "child_process";
import { fileURLToPath } from "url";
import path from "path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
export function useExternalDebugTerminal(): ChildProcess {
const terminal = spawn("x-terminal-emulator", ["-e", `yarn node ${path.resolve(__dirname, "childTerm.js")}`], {
stdio: [0, 1, 2, "ipc"],
detached: true
});
return terminal;
}
const term = useExternalDebugTerminal();
term.send("Hello, child process!\n");
这是 childTerm.js 代码:
import process from "process";
process.on("message", (msg) => {
console.log("Received message in child:", msg);
});
结果是一个短暂生成的终端,但不输出任何内容。
当我将这些添加到父级时:
term.on("error", (err) => {
console.error("Error in parent process:", err);
});
term.on("exit", (code, signal) => {
console.log(`Child process exited with code ${code} and signal ${signal}`);
});
这是输出:
Child process exited with code 134 and signal null
我对这个问题失去了理智。我考虑过使用套接字,这会更容易并且肯定会起作用,但我仍然被这个 IPC 的事情困扰,我想知道这个疯狂问题的解决方案。
谢谢你
退出代码 134 用于 SIGABRT 信号。终端窗口关闭,因为程序停止运行(被中止)。
我最近遇到了类似的问题,使用
spawn
创建的子终端会短暂打开,然后立即关闭。
事实证明我发送到
x-terminal-emulator
的命令本身不正确 - 它不会在手动打开的终端窗口上运行。
一旦我替换了错误的命令,生成的终端窗口将按预期保持打开状态。
也许在你的情况下,
yarn node ${path.resolve(__dirname, "childTerm.js")}
也是不正确的。
乍一看,您似乎将几个术语合并在一起,而
spawn
希望每个术语都是分开的。我会首先确认命令的正确性,然后将每个术语分开,如下所示:
["-e", "yarn", "node", path.resolve(__dirname, "childTerm.js")]