好的,所以我有一个主应用程序,从这个 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运行
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();
});
}