【问题标题】:NodeJS SRCDS View log of grandchild processNodeJS SRCDS 查看孙进程的日志
【发布时间】:2019-05-27 10:59:13
【问题描述】:

我正在编写一个应用程序来处理我的服务器并能够将所有输出记录到文件中。我只是在我首先看到所有输出的阶段,但看起来我没有从我的第一个子进程创建的子进程中获得输出。这是我的代码:

运行.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 在这里也不是一个选项。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    找到解决方案!

    srcds_run 是一个 bash 脚本,它最终会启动二进制文件 srcds_linux

    我发现我可以使用 node-pty 来启动 srcds_run,这将在该 pty 中启动 srcds_linux。从那里,我可以像访问 child_process 一样访问 bash 进程。您可以管理 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)
    })
    

    希望这对将来的任何人都有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      相关资源
      最近更新 更多