Tag: subprocess

通过nodejs重新附加到产生的进程

我正在Node.js中创build一个小型私有游戏服务器pipe理器; 目前它通过child_process产生游戏来运行游戏: var server = spawn(cmd, args, { cwd: 'something' }); 只要经理继续跑,我可以pipe命令,并按我的意愿处理孩子。 但是,考虑我的经理崩溃或closures的可能性。 那么我将如何重新连接到之前产生的subprocess(在经理closures时仍然在运行)呢? 我可以存储pidfiles来尝试重新连接基于pid; 但我不知道如何获得一个child_process对象访问子的stdio对象。 我真的希望这可以恢复; 任何帮助表示赞赏,谢谢! 请注意 :游戏服务器是专有的,一些例子是Minecraft,Source DS等。假设我没有访问服务器源。 编辑 从节点的child_process读取一些源代码后,看起来像是在stdinStream , stdoutStream或stderrStream选项中指定了一个属性,它应该只是打开一个套接字。 (见428-496行)。 所以问题是,我怎么停止产卵实际上做一个产卵,而只是设置基于指定的PID和我传递的stream的值。 (我会通过做fs.createWriteStream('/proc/PID/fd/0');得到我的stdinStream fs.createWriteStream('/proc/PID/fd/0');这应该工作,因为该fd被创build为一个pipe道。

NodeJSsubprocess标准输出都是数字

我正在写一些node.js脚本来启动一个subprocess。 代码片段如下。 var spawn = require('child_process').spawn; var child = spawn ('node', ['script.js']) child.stdout.on('data', function (data) { logger.verbose('tail output: ' + JSON.stringify(data)); } ); child.stderr.on('data', function (data) { logger.error('err data: ' + data); } ); 脚本运行良好,除了subprocess的stdout和stderr仅输出数字输出: 示例输出: 108,34,44,34,105,110,99,114,101,97,109,101,110,116,97,108,95,112,111,108,108,105 如何将这些数值转换为可读的string? 谢谢。

Nodejs的child_process生成自定义的stdio

我想使用自定义stream来处理child_process.spawn stdio。 例如 const cp = require('child_process'); const process = require('process'); const stream = require('stream'); var customStream = new stream.Stream(); customStream.on('data', function (chunk) { console.log(chunk); }); cp.spawn('ls', [], { stdio: [null, customStream, process.stderr] }); 我得到错误Incorrect value for stdio stream 。 有关于child_process.spawn的文档https://nodejs.org/api/child_process.html#child_process_options_stdio 。 它说stdio选项,它可以采取Stream对象 stream对象 – 将引用tty,文件,套接字或pipe道的可读或可写的stream与subprocess共享。 我想我错过了这个“指”部分。

节点subprocess:如何拦截SIGINT等信号

在我的Node应用程序中,为了正常停止(使用pm2 ,但在这里不相关),我正在使用SIGINT信号。 我的应用程序也执行/产生了一些subprocess。 我可以钩住SIGINT拦截它,并执行优雅的停止, 但是我的subprocess通过相同的信号,因此,立即死亡。 我如何在我的subprocess上拦截SIGINT信号? 我正在做的一个样本: const child = child_process.spawn('sleep', ['10000000']); console.log(`Child pid: ${child.pid}`); child.on('exit', (code, signal) => { console.log('Exit', code, signal); }); process.on('SIGINT', () => { console.log("Intercepting SIGINT"); });

child_process在node.js安全/转义中产生

在Node中,我使用了一个模块( GM ),并注意到它使用了child_process模块中的spawn来传递参数给GraphicMagick的convert可执行文件。 我将用户提交的信息传递给GM​​。 是否有安全问题,用户可以使用pipe道(或其他命令行欺骗)进行某种注入攻击? 还是spawn保护呢? 如果不是的话,在这种情况下是否有逃避用户提交值的最佳做法?

杀死一个bash脚本不会终止subprocess

我写了一个testing脚本运行另一个脚本来启动服务器来testing。 当testing完成后, SIGKILL消息被发送到服务器进程,但是当再次运行testing脚本时,服务器会抛出一个EADDRINUSE错误(我在一个node.js环境中),这意味着服务器试图挂载的端口目前正在使用中。 我们试图用SIGKILL杀死的进程仍在运行。 我不认为这是一个特定于节点的问题,而是我的末端教育缺乏教育如何工作。 这里有一些细节,这是我的脚本启动scripts/start-node.sh : #!/bin/bash node_modules/.bin/babel-node –stage 0 index.js 这是我的节点服务器称为index.js (我还没有创作任何process事件侦听器): Http.createServer(…).listen(PORT, () => console.log(`Server listening on ${PORT}`)) 启动脚本由节点child_process模块控制: var child = child_process.spawn('scripts/start-node.sh') // Later… child.kill('SIGKILL')

节点subprocess产生标准输出返回为空

我正在编写一个Yeoman生成器,并使用child_process.spawn()(通过yeoman的spawnCommand() – 请参阅https://github.com/yeoman/generator/blob/master/lib/actions/spawn_command.js ) 我的代码如下所示: var list = this.spawnCommand('npm', ['list', 'sails'], {stdio: 'pipe'}); list.stdout.on('data', /* callback here that wants to consume the command's output */); 我可以看到list.stdio存在,它有[0,1,2]作为键。 他们每个是空(或未定义)。 即,logging_.keys(list).join()输出,, 。 list.stdout.on()给我一个exception,说明stdout为空。 我需要完成的是检查是否安装了特定的软件包,并查看版本号是什么。 但是我后来还需要做其他的事情来parsingCLI命令的输出(例如,git log output),所以我需要一个通用的解决scheme。 .spawn()看起来像我想要的,但我所看到的例子似乎表明,标准输出应该是有一个.on()方法的东西。 例如,这里给出的是: http : //nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options ,它显示了运行ls -lh /usr 。 我错过了一些简单的东西吗 我想知道如果我运行的命令没有返回任何输出,如果这意味着标准输出将为空。 如果是这种情况,那么我只需要确定可能没有输出的命令,并且在尝试使用它之前检查以确保stdout不为空。 编辑实际上,npm list命令的输出显示在命令行上,但在我用来诊断问题(在.spawnCommand()调用之后和.spawnCommand()调用之前的日志语句之后。但是我需要在代码中访问它 – 让它在命令行上显示出来(除了让我知道进程成功运行CLI命令外)。

如何在node.jssubprocess模块中将消息以及从child到stdout传递给父进程?

我有一个child-process模块​​的问题,特别是与child.spawn和child.fork。 我依靠child_process.fork的文档,它说: 这是产生Node.js进程的child_process.spawn()function的特例。 除了正常的ChildProcess实例中的所有方法外,返回的对象还有一个内置的通信通道。 有关详细信息,请参阅child.send(message,[sendHandle])。 我在下面简化了我的问题: parent.js是: var cp = require('child_process'); var n = cp.fork('./child.js'); n.send({a:1}); //n.stdout.on('data',function (data) {console.log(data);}); n.on('message', function(m) { console.log("Received object in parent:"); console.log( m); }); child.js是: process.on('message', function(myObj) { console.log('myObj received in child:'); console.log(myObj); myObj.a="Changed value"; process.send(myObj); }); process.stdout.write("Msg from child"); 正如所料。 输出是: Msg from child myObj received in child: { […]

child_process.fork不打开包装电子应用程序内的快递服务器

我有一个电子应用程序,我不仅需要运行界面的用户,而且还启动一个快递服务器,将为通过networking连接的人提供文件。 如果我正常启动电子服务器和快速服务器,我都能正常工作,但是我非常有把握,我需要运行在不同线程中的服务器,以避免出现糟糕的界面甚至服务器问题。 对于这个问题,我尝试使用child_process.fork运行我的快递服务器,并且在使用npm start ,但是当我使用electron-builder创build一个.exe时,安装的程序不启动express服务器。 我试图立即运行我的服务器使用: require('child_process').fork('app/server/mainServer.js') 我尝试了几个改变,用__dirname , process.resourcesPath作为文件前缀,甚至对生成的文件path进行硬编码; 更改fork选项以传递cwd: __dirname , detached: true和stdio: 'ignore' ; 甚至尝试使用与process.execPath spawn ,这也将与npm start工作,但不会打包时(它不断打开我的应用程序的新实例,似乎很明显后,你做嘿嘿) 注意:如果我不需要fork,并且需要服务器脚本,使用require('server/mainServer.js')它可以在打包的应用程序上工作,所以最类似的问题不是require('server/mainServer.js')本身。 注2:我有asar: false来解决其他问题,所以这里不是解决问题的方法。 我build了一个小的git项目来显示我的问题: https://github.com/victorivens05/electron-fork-error 任何帮助将不胜感激。

nodejs exec命令失败,没有有用的错误消息

这是要执行的代码 cp.exec("cc -Wall /tmp/test.c -o /tmp/test", function(e, stdout, stderr) { if (e) { var errorstr = "Compilation failed with the following error "+ e.message.toString() client.send(errorstr) console.log(e, stdout, stderr) ee.prototype.removeAllListeners() } else if (stderr.length > 0) { client.send("Compilion finished with warnings\n"+ stderr + '\n') client.send('compiled') ee.prototype.emit('compiled') } else { client.send("Compilation successful") ee.prototype.emit('compiled') } }) 'client'是socket.io的callback参数的参数。 'ee'是EventEmitter的一个实例 […]