![仅当文件关闭时才执行读取](https://linux22.com/image/127953/%E4%BB%85%E5%BD%93%E6%96%87%E4%BB%B6%E5%85%B3%E9%97%AD%E6%97%B6%E6%89%8D%E6%89%A7%E8%A1%8C%E8%AF%BB%E5%8F%96.png)
我面临一个问题,只有当文件未被使用或被任何其他程序写入时,我才必须编写一个 shell 脚本来读取该文件。我无法使用 lsof,因为该脚本将在运行 QNX 的嵌入式硬件上运行,具有非常基本的 shell 功能,因此没有第三方工具和库。
答案1
我想我已经找到答案了。将其作为脚本的一部分:
#!/bin/bash
# Script to prevent writing to a certain file.
# This should be adjusted to your needs, replace all /paths/ and <xxxxxxx>
# with your true paths and filenames.
chmod +r /path_to_file/<filename>
<now_do_what_you_want_with_that_file, command(s) here>
for a in {120..1}; do echo -n "$a..." && sleep 1; done # In 120 seconds <filename> will be writable.
chmod -r /path_to_file/<filename>
还可以创建一个脚本来将该文件复制到另一个位置,然后阅读它的副本,该副本既未打开也未使用,完成后 X 秒后删除它。
如果需要的话,您可以重复此操作。
答案2
如果您不知道文件当前是否已写入,并且没有机会找出程序是否正在使用它,您可以考虑检查 ctime、mtime 和 atime。您可以使用“stat”命令来执行此操作,该命令在大多数系统中都可用。你可以检查3-4次,如果没有差异,就写下来。注意atime(访问时间)只要你查看就会一直变化!
另一个想法是制作文件的副本并使用该副本。完成工作后,对修改后的副本和原始副本进行比较,如果没有其他更改,则替换它。另外,您可以尝试使用“diff”和“patch”。我建议在执行此操作之前先进行备份!
答案3
免责声明:我对QNX了解不多,对嵌入式设备了解更少。
您所询问的基本上是关于文件锁定:进程尝试获取锁定文件上的共享锁(读锁)以执行某些操作。如果另一个进程在同一锁上持有排它锁(写锁),则第一个进程将阻塞,直到排它锁被释放为止。或者相反,只有当没有其他进程具有共享的活动共享/排它锁时,进程才可以获取排它锁。
去做强制的文件锁定,这必须得到内核的支持。很少有 Unix 系统能够通过 shell 脚本可靠地工作来实现这一点(对于 Linux,请参见本文从 2007 年开始,以及这个问题在 StackOverflow 上)。
咨询锁定是通过诸如 之类的程序在用户空间中实现的flock
。这种类型的文件锁定需要进程合作这意味着他们需要明确请求对锁定文件的读或写访问权限。同时,不合作的进程仍然可能忽略锁定机制。
问题“Flock 似乎不起作用" 是关于flock
在 shell 中使用建议性锁定。
也可以看看:哪些 Unix 命令可以用作信号量/锁?(这也与咨询锁定有关,一些答案用于mkdir
此目的,因为它是原子操作)。