【发布时间】:2023-12-18 08:43:01
【问题描述】:
我的节点进程通过 HTTP 请求获取一些 PDF 文件,然后使用请求的 onData 事件将传入数据传递到通过 child_process.exec 生成的正确配置的 lpr。我使用process.stdin.write(...) 写入标准输入,然后在完成后使用process.stdin.end()。这让我可以立即打印这些文件。
现在我有一种情况,我不希望将数据通过管道传输到 lpr,而是传输到一些 bash 脚本。该脚本使用cat 处理其stdin。
myscript.sh < somefile.pdf 按预期工作,cat somefile.pdf | myscript.sh 也是如此。
但是,当我从节点生成 /path/to/script.sh 时(只需将 lpr 替换为源中的脚本路径),进程退出
events.js:183
throw er; // Unhandled 'error' event
^
Error: write EPIPE
at WriteWrap.afterWrite [as oncomplete] (net.js:868:14)
随后,整个节点进程崩溃,错误潜入所有try...catch 块。 bash 脚本开头的日志显示,它甚至没有启动。
当我针对任何不是 shell 脚本而是一些已编译的可执行文件(如 cat、echo、...)时,一切正常。
添加epipebomb module 不会改变任何东西。
我也尝试通过管道连接到process.exec("bash", ["-c cat | myscript.sh"]),但出现了同样的错误。
一个示例 bash 脚本,仅用于测试执行:
#!/usr/bin/env bash
date > logfile.txt
cat > /dev/null
编辑: 我想我可能需要发出信号以保持标准输入流以某种方式打开。 脚本的进程生成部分,不考虑承诺和输出处理:
const process = require("child_process")
// inputObservable being an rxjs Observable
execstuff(inputObervable) {
const task = process.spawn("/path/to/script.sh");
inputObservable.subscribe(
chunk => task.stdin.write(chunk),
error => console.error(error),
finished => task.stdin.end()
);
}
【问题讨论】:
-
你能把你的脚本代码贴出来吗,我直觉你没有正确使用流...
-
我添加了一些代码@AlexandruOlaru
-
对此是否有任何可接受的解决方案? @waechtertroll