这个问题已经在这里被问过了,我已经找到了问题第一部分的解决方案。所以目前我有一个 bash 脚本(脚本1)我评估特定文件的 sha1sum(输出文件)定期(假设每 1 秒)。然后sha1sum_cur != sha1sum_prev
我运行另一个脚本(脚本2) 和一些命令。这样就表示文件已被修改。
我的问题是输出文件占用了相当多的 MB,而且写入时间相当长。所以,我不想运行脚本2正在写入数据时,但写入数据的过程已完成。输出文件是由 fortran 代码创建的,因此假设每 1 小时它会删除以前的数据并写入新的数据,但这大约需要 5 分钟。
最后两个重要说明:1)由于我正在将我的作业提交给集群,因此我没有权限安装 inotify-tools。2)我可以通过 fortran 代码调用脚本,但是close(output.txt)
我CALL system(./script2)
宁愿不这样做,因为它是并行的并且不想降低它的效率。
所以问题是,我可以补充什么脚本1这样它就能理解将数据写入输出文件已完成?
答案1
你可以使用lsof检查是否有任何进程正在访问该文件。但是,这无法防止其他进程更改该文件后您已经检查了 shell 脚本中的访问权限。
为了避免竞争条件,我会使用原子文件操作,例如动量,以标记您的 shell 脚本或其他软件尚未“获取”该文件。这是一个内核调用,并且保证是原子的(例如,如果两个进程同时对同一个文件调用 mv,则一个进程将成功,另一个将失败)。
另一种可能性是使用外部锁定工具,如锁文件程序,但是您无法从丢弃该文件的软件中使用它们。动量尽管可能被认为是一种不道德的解决方案,但它却是普遍适用的。