当生成 .exe 文件时出现 node ebusy 错误。

3
我正在使用从服务器下载的临时文件进行编程,但在macOS上运行良好,按照其应该做的事情运行。但是在Windows上运行时,尝试生成子进程时一直出现EBUSY错误。我尝试了延迟文件的启动时间,并尝试删除chmod,以便仅在Linux和macOS上运行。但仍然收到EBusy错误。我做错了什么吗?
注: 我可以从外部的另一个节点实例启动二进制文件,比如从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)
})

更新: 我注意到在创建文件的进程结束之前,我无法运行该文件。这意味着需要使用它的进程正在使用它。但是我不能按照我想要的方式使用它,例如生成它。 错误 更新2: 我尝试的下一件事是使用node创建符号链接。但是仍然没有改变,但我注意到在主进程结束之前,该文件不会变得可运行。这意味着我正在运行的进程与此有关。因此,我需要能够将其从正在运行的进程中取消连接。似乎Windows需要在创建文件后进行一些初始化。由于它仍然与主进程以某种方式连接,因此无法这样做。我猜这就是为什么当我结束进程时,节点图标显示在符号链接上,这也是我能够手动运行它的原因。

最终更新: 我将开发一个文件系统模块,它的作用类似于临时文件,但实际上是普通文件。进程会跟踪这些文件,并提供临时文件的功能,但实际上不是临时文件。这样可以让我使用临时文件的功能,但文件仍然可以被执行。似乎将其设置为临时文件导致创建它的同一进程无法执行该文件。这似乎是Windows文件系统处理临时文件权限的问题。

1个回答

0
在Windows中处理Temp文件的方式与macOS不同。据我最好的估计,Windows中的Temp文件似乎是与创建它们的进程链接的,并且无法由该进程更改或访问。问题在于试图执行这些被Windows分配给已有进程的临时文件,因此无法重新分配。NodeJs需要能够访问该文件才能启动它,但Windows权限不允许,除非结束主进程。这将取消该文件与该进程的链接,使其对系统的其余部分可访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接