Node.js:使用fs.writeFileSync写入系统文件

4

我正在尝试使用fs.writeFileSync写入/sys/kernel/config/usb_gadget下的系统文件,但是当将""作为内容写入时,文件保持不变(原始内容完好无损),并返回

Error: EBUSY: resource busy or locked, write
    at Object.writeSync (fs.js:581:3)
    at Object.writeFileSync (fs.js:1275:26)
    at Socket.<anonymous> (/opt/sterling/ip-kvm-interface/app.js:249:6)
    at Socket.emit (events.js:210:5)
    at /opt/sterling/ip-kvm-interface/node_modules/socket.io/lib/socket.js:528:12
    at processTicksAndRejections (internal/process/task_queues.js:75:11) {
  errno: -16,
  syscall: 'write',
  code: 'EBUSY'
}

在编写其他内容时,目标写入文件的权限为777。

fs.writeFileSync不能写入sys下的文件吗?还是我漏掉了什么?

使用fsuser /sys/kernel/config/usb_gadget/kvm-gadget/UDC没有返回结果(即使Node进程正在运行),而且lsof | grep /sys/kernel/config/usb_gadget/kvm-gadget/UDC也没有返回结果。

我是否需要生成echo进程来使其工作(虽然不是首选,但我想过这种方法——因为我不确定如何将其转换为同步任务)?


在Raspbian Buster中,使用命令“echo "" > file”会导致持久更改。 - Sterling Butters
也许为 fs.writeFileSync() 提供一些自定义的 modeflag 参数会更有可能对你有用?正如你在 源代码 中看到的,当你没有传递任何参数时,fs.writeFileSync() 的默认值为 mode: 0o666, flag: 'w'。运行一些实验并尝试不同的模式或标志。 - jfriend00
@jfriend00 看起来模式只是指访问文件所使用的权限,对于这种情况 0o666 应该足够了,而 0o777 则不需要。在我的情况下,flags 指的是 'w':写入或 'a':追加,我需要前者。还有其他想法吗? - Sterling Butters
请留下一些你的代码,也许我可以帮助你。 - AmerllicA
1
如果你不同意我给出的答案,@AmerllicA,我可以在今天晚些时候发布。也就是说,如果答案与你预期的问题不符,请告诉我。 - Sterling Butters
显示剩余12条评论
1个回答

4

https://github.com/nodejs/help/issues/2459

Are there undocumented limitations to fs.writeFileSync that I am unaware of?

Nothing specific to fs.writeFileSync(), you can get the same error with a plain C program.

/sys/kernel/config/usb_gadget is not a real file, it's a communication channel with the kernel's usb gadget driver. It's that driver that is returning the error.

(I could point you to the line of code if you're really interested. It's drivers/usb/gadget/configfs.c in the kernel source tree in any case.)


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