我正在使用从服务器下载的临时文件进行编程,但在macOS上运行良好,按照其应该做的事情运行。但是在Windows上运行时,尝试生成子进程时一直出现EBUSY错误。我尝试了延迟文件的启动时间,并尝试删除chmod,以便仅在Linux和macOS上运行。但仍然收到EBusy错误。我做错了什么吗?
注: 我可以从外部的另一个节点实例启动二进制文件,比如从cmd。但是从创建它的节点实例启动它会导致EBusy错误。
更新: 我注意到在创建文件的进程结束之前,我无法运行该文件。这意味着需要使用它的进程正在使用它。但是我不能按照我想要的方式使用它,例如生成它。
更新2:
我尝试的下一件事是使用node创建符号链接。但是仍然没有改变,但我注意到在主进程结束之前,该文件不会变得可运行。这意味着我正在运行的进程与此有关。因此,我需要能够将其从正在运行的进程中取消连接。似乎Windows需要在创建文件后进行一些初始化。由于它仍然与主进程以某种方式连接,因此无法这样做。我猜这就是为什么当我结束进程时,节点图标显示在符号链接上,这也是我能够手动运行它的原因。
注: 我可以从外部的另一个节点实例启动二进制文件,比如从cmd。但是从创建它的节点实例启动它会导致EBusy错误。
temp.open('', (err, info) => {
if (err) throw err;
console.log('File: ', info.path);
console.log('Filedescriptor: ', info.fd);
var data = fs.createWriteStream(info.path);
res.data.pipe(data);
data.on('close', async () => {
fs.chmodSync(info.path, 0o755);
await delay(1000);
var child = cp.spawn(info.path, [key, jwt], { stdio: ['inherit', 'inherit', 'inherit', 'ipc'] });
错误:
Error: spawn EBUSY
at ChildProcess.spawn (node:internal/child_process:415:11)
at Object.spawn (node:child_process:707:9)
at WriteStream.<anonymous>
at WriteStream.emit (node:events:394:28)
at emitCloseNT (node:internal/streams/destroy:138:10)
at processTicksAndRejections (node:internal/process/task_queues:82:21) {
errno: -4082,
code: 'EBUSY',
syscall:
编辑: 我创建了一个新的模块来尝试以这种方式生成子进程。它将在主进程中分叉。但是我仍然在分叉中遇到相同的错误。仍然是同样的错误。
const cp = require('child_process')
const childpath = process.argv[2]
var argv = [];
for (let index = 3; index < process.argv.length; index++) {
const element = process.argv[index];
argv.push(element)
}
console.log(argv)
var child = cp.spawn(childpath, argv, {
stdio: ['inherit', 'inherit', 'inherit', 'ipc']
})
child.on('message', (msg) => {
if (process.send) process.send(msg)
else process.emit('message', msg)
})
child.on('error', (msg) => {
console.log(msg)
process.emit('error', msg)
})
child.on('close', (msg) => {
process.exit(msg)
})
更新: 我注意到在创建文件的进程结束之前,我无法运行该文件。这意味着需要使用它的进程正在使用它。但是我不能按照我想要的方式使用它,例如生成它。
![错误](https://istack.dev59.com/8oiSp.webp)
最终更新: 我将开发一个文件系统模块,它的作用类似于临时文件,但实际上是普通文件。进程会跟踪这些文件,并提供临时文件的功能,但实际上不是临时文件。这样可以让我使用临时文件的功能,但文件仍然可以被执行。似乎将其设置为临时文件导致创建它的同一进程无法执行该文件。这似乎是Windows文件系统处理临时文件权限的问题。