问题标签 [file-locking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
743 浏览

java - 相应地锁定和更新文件

注意:我已阅读有关如何锁定和解锁文件的其他帖子。我没有发现任何我不知道的特别之处。所以我会把我的场景放在这里,以便更好地理解手头的问题。

根据我的经验,当来自多个 jvm 实例的不同对象尝试锁定和更新文件时,FileChannel.lock 不保证锁定和解锁文件。

我的应用程序中的场景是 - 有三个单独的程序更新文件。这些程序正在不同的 jvm 实例上运行。假设程序是 A、B 和 C;并且文件是 F。如果 A 锁定了文件 F,B 和 C 应该等待 F 被释放,然后其他程序之一才能获得它。如果程序在同一个 jvm 实例上运行,这将很好。不幸的是,这在多个 jvm 实例中不起作用。

我有另一个想法,那就是有一个平面文件,我会在其中指出是否应该更新 F。该平面文件的内容可以是 LOCKED 或 UNLOCKED。默认/初始值将是 UNLOCKED。因此,当其中一个程序想要更新 F 时,它需要查看平面文件中的标志。如果 flag 读取 LOCKED,它应该等待。在这种方法中,虽然存在一个问题 - 如果多个程序同时打开平面文件并看到“UNLOCKED”或两个正在等待平面文件读取 UNLOCKED 的程序同时看到文件读取“怎么办?解锁”?

任何的想法?

0 投票
1 回答
1627 浏览

unix - 文件读写锁定和取消链接

我有以下问题。我想创建一个基于文件系统的会话存储,其中每个会话数据都存储在以会话 ID 命名的简单文件中。

我想要以下 API: write(sid,data,timeout), read(sid,data,timeout),remove(sid) 其中 sid==file name, 另外我想要某种可以删除所有超时会话的 GC。

如果您使用单个进程,则任务非常简单,但在使用多个进程甚至通过 NFS 时绝对不是微不足道的。

我想到的最简单的解决方案是:

文件取消链接适用于文件名和文件锁适用于文件描述符的最大问题。因此,上述情况在以下情况下不起作用:

有人知道如何解决此类问题吗?是否有任何技巧可以结合文件锁定和文件删除或对文件进行原子操作?

笔记:

  • 我不想使用数据库,
  • 我正在寻找 Unix 的解决方案
  • 解决方案应适用于标准 POSIX 调用,如 fcnl、打开、关闭、取消链接

谢谢。

澄清主要问题是对文件的操作(名称 - 取消链接)应该通过文件描述符的操作原子地完成 - 锁定:

  • 打开,取消链接——处理文件
  • fnctl -- 处理描述符
0 投票
3 回答
1367 浏览

winapi - 文件解锁和删除作为单一操作

请注意,这不是File r/w locking 和 unlink的重复。(区别-平台。文件的锁定和删除等操作具有完全不同的语义,因此结果会有所不同)。

我有以下问题。我想创建一个基于文件系统的会话存储,其中每个会话数据都存储在以会话 ID 命名的简单文件中。

我想要以下 API: write(sid,data,timeout), read(sid,data,timeout), remove(sid) where sid==file name, 另外我想要某种可以删除所有超时会话的 GC。

如果您使用单个进程,则任务非常简单,但在使用多个进程甚至共享文件夹时绝对不是微不足道的。

我想到的最简单的解决方案是:

但是 AFIAK 我不能调用DeleteFile打开的锁定文件(不像在 Unix 中文件锁定不是强制性的,并且打开的文件允许取消链接。

但是如果我把DeleteFile锁定循环之外的情况可能会发生

有人知道如何解决此类问题吗?是否有任何技巧可以结合文件锁定和文件删除或对文件原子(Win32)进行操作?

笔记:

  • 我不想使用数据库,
  • 我正在寻找适用于 NT 5.01 及更高版本的 Win32 API 的解决方案

谢谢。

0 投票
4 回答
5993 浏览

bash - 如何检查flock执行的命令的退出代码?

大家好。我正在设置一个 cron 作业来执行一个 bash 脚本,我担心下一个可能会在前一个结束之前开始。用谷歌搜索一下,解决这个问题的一种流行方法是flock命令,以下列方式使用:

这很好用。但是,如果我想检查退出代码myscript.sh怎么办?无论它返回什么退出代码都会被flock's 覆盖,所以我无法知道它是否成功执行。

0 投票
0 回答
3496 浏览

windows - 以编程方式确定哪个进程 (b) 锁定文件(在 Windows >= XP 下)

如何以编程方式从进程 P 确定哪个其他进程 P' 锁定了文件,从而阻止 P 重新创建该文件?

我知道有工具可以做到这一点,但他们是如何实现的呢?

(上下文:由于文件锁定,一个批处理程序在夜间运行失败。第二天运行管理工具可能为时已晚,无法获得有用的信息。因此,如果批处理程序本身能够确定罪魁祸首,那就太好了。)

编辑:增加了复杂性:文件位于 DFS 上,并且 P' 可能不会与 P 在同一台机器上运行(但可能会)。但是,在本地工作的解决方案将是一个好的开始。

0 投票
2 回答
4975 浏览

java - 如何找出哪个线程在java中锁定文件?

我正在尝试删除我程序中另一个线程以前使用过的文件。

我无法删除该文件,但我不确定如何确定哪个线程可能正在使用该文件。

那么我如何找出哪个线程在java中锁定了文件?

0 投票
2 回答
33 浏览

c# - 一项服务附加到文件,另一项服务截断文件

我有一项服务可以控制 RS-232 设备并将操作记录到文件中。我要编写另一个服务,它将逐行读取日志文件并在数据库上运行一些查询,然后删除所有日志。

我担心的是文件上的读写冲突。例如,记录器服务打开文件以追加新行,同时复制器服务打开文件并写入“”以截断其内容。

有什么建议可以澄清我的情况吗?

0 投票
3 回答
37953 浏览

java - 用于读写的 Java FileLock

我有一个进程会经常从 cron 调用,以读取其中包含某些与移动相关的命令的文件。我的进程需要读取和写入此数据文件 - 并保持锁定以防止其他进程在此期间接触它。用户可以执行一个完全独立的过程来(潜在的)写入/附加到这个相同的数据文件。我希望这两个进程运行良好,并且一次只能访问一个文件。

nio FileLock 似乎是我需要的(没有编写我自己的信号量类型文件),但我无法锁定它以供阅读。我可以锁定和写得很好,但是在阅读时尝试创建锁定时,我得到了一个 NonWritableChannelException。甚至可以锁定文件以供阅读吗?似乎 RandomAccessFile 更接近我的需要,但我不知道如何实现它。

这是失败的代码:

在 FileLock 行上引发异常。

查看JavaDocs,它说

尝试写入最初未打开用于写入的通道时引发未经检查的异常。

但我不一定需要写信给它。当我尝试为写作目的创建 FileOutpuStream 等时,我很高兴直到我尝试在同一个文件上打开 FileInputStream。

0 投票
4 回答
311 浏览

perl - 我的 Linux 守护进程如何知道 Windows 程序何时停止写入我通过 SAMBA 访问的文件?

我正在开发一个与名为 Dazzle 的 USPS 运输包接口的系统。该系统的一部分包括一个监控守护进程,其目的是获取制表符分隔的值文件,将它们转换为 Dazzle 识别的 XML,并将它们传递给 Dazzle 以生成标签。这部分工作得很好。然而,我还想做的是解析 Dazzle 生成的输出文件并将其导入数据库。

请注意,Dazzle 在 Windows 上运行。我的监控守护程序是用 Perl 编写的,并在 Linux 上运行。我的 Linux 系统通过 Samba 挂载了 Dazzle 的输入和输出目录。

Dazzle 开始写入输出文件的时间和它完成的时间之间有一个可测量的延迟。我想知道的是如何等待 Dazzle 完成输出文件的写入?我试过打开文件并对其进行flock($fh, LOCK_SH)操作,但这似乎没有任何好处。

编辑:我有一个基于下面“mobrule”评论的想法。Dazzle 以 XML 格式编写输出文件。货件中的每个包裹都附在标签中,整个文件都附在标签中。因此,如果我在文件完成之前开始阅读文件,我可以在采取行动之前等待适当的结束标记。

另外,我应该提到我目前正在做的事情。当我检测到输出 XML 文件已创建时,我尝试对其进行解析。如果解析失败,我会睡觉并重试。如果失败,我会睡两倍的时间,然后再试一次,依此类推。这在 64 秒超时的测试中效果很好。

0 投票
1 回答
414 浏览

.net - 安全锁定文件然后移动?视窗

我有一个文件,需要在将一行插入数据库之前确保它存在。插入后,我需要使用 PK 作为文件名的一部分并将其移动到另一个位置。

我如何检查它是否存在然后锁定它以便在我可以插入数据库之前无法删除它然后继续移动文件而不在释放锁定时删除它?

该文件也可能正在使用中。我正在考虑将文件复制到安全位置,然后将该文件移走。在这种情况下,我需要复制一个用于读取的文件。我怎样才能安全地完成上述步骤?

使用 .NET