Para un proceso principal de CLI, tengo un proceso secundario en el que necesito escribir algunos datos antes de que se detenga (por ejemplo, un código de cierre de WebSocket que no sea 1006).
Este fragmento representa lo que estoy haciendo:
setInterval(() => child.stdin.write("ping\n"), 1000); const { spawn } = require("child_process"); const child = spawn("node", ["-e", ` setInterval(() => console.log("child: pong"), 1000); process.on("beforeExit", () => { console.log("child: stopping"); }); process.stdin.on("close", () => console.log("stdin close")); process.stdin.on("finish", () => console.log("stdin finish")); process.on("SIGINT", () => console.log("child: SIGINT")); process.stdin.on("data", (c) => console.log("child: from parent:", c.toString("utf8").trim())); `], { detached: true, //// if 'ignore' is used, child.stdin is undefined // stdio: ["ignore", "inherit", "inherit"], }); child.stdout.pipe(process.stdout); child.stderr.pipe(process.stderr); process.on("SIGINT", () => { console.log("parent: stop requested"); child.stdin.write("stop\n"); // cleanup something setTimeout(() => { console.log("parent: stopping on our own discretion"); child.kill(0); process.exit(0); }, 500); });Intenté usar Stream.Readable o Passthrough como propiedad de flujo de stdio, pero parece que NodeJS solo permite el uso de flujos de descriptores de archivos. No quiero ir tan lejos como para crear un archivo temporal solo para este caso.
Siento que esto debería ser posible/trivial, pero me estoy tirando de los pelos para que funcione.
El ejemplo simplificado en realidad funciona bien. Algo debe estar pasando con mi código original.
Producción:
-> % node sample.js child: from parent: ping child: pong child: from parent: ping child: pong ^C parent: stop requested child: from parent: stop child: from parent: ping parent: stopping on our own discretion