我正在使用lockfile.locksync锁定node.js中的一个文件。但我想知道这个实用程序的完整机制。到目前为止,每个网站都说这是一个“非常礼貌的锁文件实用程序”,但没有解释这个实用程序的内部机制。
有什么建议吗?
发布于 2020-05-14 12:45:45
节点FS
要理解Node.js中的文件选项,请看一下标志和Linux,其中包括以下选项
O_TRUNC -截断现有文件
O_CREAT -如果不存在创建
O_WRONLY -访问模式,只写
O_EXCL -确保此调用创建文件。如果文件存在,则在与O_CREAT配对时触发EEXIST错误。
但它不提供类似于"群群"的文件锁替代方案
NPM LOCKFILE调查
我尝试使用称为“锁文件”的npm库,因为其中包含了太多的复制/粘贴示例。
判决。当前实现"v1.0.4“的”锁文件“npm库是不完整/无用的!
来自来源
exports.lockSync = function (path, opts) {
opts = opts || {}
opts.req = opts.req || req++
debug('lockSync', path, opts)
if (opts.wait || opts.retryWait) {
throw new Error('opts.wait not supported sync for obvious reasons')
}
try {
var fd = fs.openSync(path, wx)
locks[path] = fd
try { fs.closeSync(fd) } catch (er) {}
debug('locked sync!', path, fd)
return这样,在“尝试{}”中的5行实际代码只会在"wx“模式下阻止"openSync”,将"path“保存到"lockspath”和"closeSync“。如果文件存在,它将失败!因为"wx"!
您不能用“锁文件”库锁定现有文件!
最后,它尝试用以下代码调用具有unlockSync信号的“onExit”:
exports.unlockSync = function (path) {
debug('unlockSync', path)
// best-effort. unlocking an already-unlocked lock is a noop
try { fs.unlinkSync(path) } catch (er) {}
delete locks[path]
}是的,它会在进程退出后删除您的文件!
,这不是文件锁定机制!
NODEJS文件锁有可靠的解决方案吗?
我发现fs-ext的工作非常完美!使用node进程打开2个选项卡,检查锁定文件意味着什么:
tab1
const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('1.txt', 'w');
flockSync(fd, 'ex');tab2
const fs = require("fs");
const {flockSync} = require('fs-ext');
const fd = fs.openSync('1.txt', 'r');
flockSync(fd, 'sh'); // PENDING!在tab2中,flockSync(fd, 'sh');将挂起直到在tab1中调用flockSync(fd, 'un');!
真的很管用!
https://stackoverflow.com/questions/40864311
复制相似问题