我正在编写一个应用程序来处理我的服务器,并且能够将所有输出记录到文件中。我正处在首先看到所有输出的阶段,但是好像我没有从我的第一个子流程创建的子流程中获取输出。这是我的代码:
run.js
const {spawn} = require('child_process')
const server = spawn('bash', ['srcds_run'])
console.log('spawned ' + server.pid)
server.stdout.on('data', data => {
process.stdout.write(data)
})
server.stderr.on('data', data => {
process.stdout.write(data)
})
server.stdin.on('data', data => {
process.stdout.write(data)
})
在控制台中,它打印所有内容,直到srcds_run
脚本将其传递到主服务器进程srcds_linux
为止。一旦传递下去,将不再有任何输出,但是将启动该过程并且服务器已启动。
这是流程树外观的一个示例。
https://i.linkjay.io/JBipdX.png
以及它如何在节点中运行
https://i.linkjay.io/YzmhIL.png
它将打印srcds_run
中的所有内容,而不打印srcds_linux
中的任何内容。
此处也不提供Logaddress。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:0)
找出解决方案!
srcds_run
是一个bash脚本,最终会启动二进制文件srcds_linux
。
我发现我可以使用node-pty来启动srcds_run
,而该srcds_linux
将以该pty开始。从那里,我将可以访问bash进程,就好像它是child_process一样。您可以管理stdio,也可以管理流程本身。
代码示例:
const pty = require('node-pty')
const path = require('path')
const folder = '/home/local/folders/servers/gmod'
const binary = 'srcds_run'
const args = ['-gamemode sandbox', '+map gm_flatgrass']
const proc = pty.spawn('bash', [path.join(folder, binary)].concat(args), {
cwd: folder
})
proc.on('data', (data) => {
console.log('out: ' + data)
})
希望这对以后的所有人有帮助!