假设我像这样启动一个 node.js 进程:
node script.js &
有没有办法在进程启动后将数据通过管道传输到该进程中?
通常,我们这样做:
cat <file> | node script.js
但我看到的问题是,有时 Node.js 进程实际上不会提前启动。
我的目标是确保无论如何,即使文件中没有数据,node.js 进程都会启动。
所以我正在考虑将 node.js 进程作为后台进程启动,然后将其连接到管道,不确定这是否可行。
答案1
听起来您正在寻找使用 . 创建的命名管道(fifos)的某种变体mkfifo
。
然后你可以做这样的事情:
mkfifo my-pipe
node script.js < my-pipe &
请注意,它将阻塞,直到有东西打开 my-pipe 进行写入。因此,如果您希望 script.js 能够打开该文件(但当然还不能从中读取任何内容),那么您需要打开它进行写入;一个简单的方法就是将睡眠重定向到它(sleep 3650d > my-pipe &
)。这也将阻止 script.js 获取 EOF(文件结束),直到您终止睡眠(当没有 fifo 打开用于写入且所有数据都消失时,读取端会获取 EOF)。
现在,您可以随时通过写入 my-pipe 来为其提供更多行。任何不查找(或 mmap 等)的写入都可以工作。你可以用 进行测试echo 'DATA' > my-pipe
。
所以,综合起来:
mkfifo my-pipe
node script.js < my-pipe &
sleep 3650d > my-pipe &
sleep_pid=$!
get-data-command > my-pipe # placeholder for real command to get data
get-data-command > my-pipe
# and so on, for more data.
kill $sleep_pid # kill the sleep, giving script.js an EOF.
正如 Wildcard 指出的那样,您实际上可能希望 script.js 打开侦听套接字并以这种方式接受数据。如果您想避免像在 TCP 套接字上那样必须处理身份验证,则可以使用 Unix 域套接字(因为 Unix 套接字使用文件权限)。