Nodejs Spawn 无法使用手动运行的 js 文件

问题描述 投票:0回答:1

好的,所以我有一个主应用程序,从这个 Express 服务器运行 Express 服务器,我有一个接受带有 id 的 get 请求的端点

当用户请求此端点时,会运行一个函数来生成一个独立的进程,该进程接受 id 作为参数,然后开始在后台下载文件列表

现在,如果我从终端手动运行它并使用 args 传递参数,我的下载器 js 文件可以完美运行,不会出现任何错误。

node downloader argid
它输出所有正确的内容并且所有内容都已下载

但是当我尝试使用此代码从我的主脚本中运行相同的下载器文件时

downloaderSpawn() { const nodeBinary = '/usr/bin/node'; const childScriptPath = '/home/ebo/downloader.js'; const logFilePath = `/home/ebo/${this.id}/logfile.txt`; const command = `${nodeBinary} ${childScriptPath} ${this.id} ${this.key} > ${logFilePath} 2>&1`; const childProcess = exec(command); childProcess.stdout.on('data', (data) => { console.log(`Child Script Output: ${data}`); }); childProcess.stderr.on('data', (data) => { console.error(`Child Script Error: ${data}`); }); childProcess.on('close', (code) => { console.log(`Child process exited with code ${code}`); }); }
我尝试过使用和不使用

> ${logFilePath} 2>&1

选项,日志文件已创建,但从未填充下载器的输出,告诉我脚本从未运行

这个函数来自一个更大的类内部,除了这个函数之外,这个类中的其他所有内容都按预期工作,并且如上所述,下载器 js 文件在单独调用时可以正常工作

我目前被迫使用 ubuntu 20,因为这是客户端提供的 ubuntu 20 存储库中的节点版本似乎是 18.19.0

我尝试过使用exec和spawn我也尝试过使用

分离进程

const childProcess = spawn(command, { shell: true, detached: true, stdio: 'ignore', // Optionally ignore stdio if not needed });
我在主脚本控制台或日志文件中收到 0 个错误或任何类型的输出,其已设置为重定向到

编辑:我已经升级到节点版本 21 仍然是同样的问题,子脚本似乎根本没有从spawn / exec运行

node.js shell child-process spawn
1个回答
0
投票
只需使用叉子并正确执行即可:

downloaderSpawn() { // you don't need this: fork executes node instance automatically // const nodeBinary = '/usr/bin/node'; const childScriptPath = '/home/ebo/downloader.js'; const logFilePath = `/home/ebo/${this.id}/logfile.txt`; // control logging from code, instead delegate that to the bash const logStream = fs.createWriteStream('logFilePath'); // you don't need this // const command = `${nodeBinary} ${childScriptPath} ${this.id} ${this.key} > ${logFilePath} 2>&1`; // pass arguments as array to fork const childProcess = fork(childScriptPath, [this.id, this.key], { // if you need to exchange between processes data types, // like BigInt, Typed Arrays, Map, Set, etc serialization: 'advanced' }); // use 'message' event and send method for exchange typed data // instead just a strings childProcess.on('message', msg => { console.log( `msg, sended to parent, using process.send(msg): ${msg}` ); }) childProcess.stdout.on('data', (data) => { console.log( `Child Script Output using console.log, or process.stdout.write: ${data}` ); logStream.write(data.toString('utf8')); }); childProcess.stderr.on('data', (data) => { console.error( `Child Script Output, using console.error, or process.stderr.write: ${data}` ); logStream.write(data.toString('utf8')); }); childProcess.on('close', (code) => { console.log(`Child process exited with code ${code}`); logStream.close(); }); }
    
© www.soinside.com 2019 - 2024. All rights reserved.