如何解决如何读取多次被覆盖的文件?
我有一个bash脚本,它会不断地抓取屏幕截图,通常每次运行需要1-2ms。
我还希望有一个单独的进程,该进程在另一个线程上不断运行,该进程将获取所述屏幕截图文件并对其进行处理(裁剪,读取等)。
有时候我可以并排运行,但是有时进程B试图读取进程A仍在写入的文件。
该如何处理?
我想像缓存/复制/缓冲区之类的东西会有所帮助,但是我不确定。
解决方法
我记得文件锁,而这正是我需要的。
在截取屏幕快照时,我将使用UNIX的flock(具有排他锁),而在读取文件时,我将使用Ruby的File#flock(具有共享锁)。
这应该做到!
,我制作了几个简单的文件,它们分别在控制齐射之前和之后执行操作-在这种情况下,只需报告哪个文件位于循环中的哪个位置,所以我实际上只是将其符号链接到第二个名称。我称他们为a&b。
$: cat a
for a in 1 2 3
do echo "$0 $a before: $(date)"
kill -CONT -1 # NOTE: sends the signal to ALL procs in group
kill -STOP $$
echo "$0 $a AFTER: $(date)"
done
kill -CONT -1
b是同一个文件,只是另一个名称。
同时运行。最后使用wait
清除提示。
$: ./a;./b;wait
./a 1 before: Mon,Aug 10,2020 12:56:41 PM
[1]+ Stopped ./a
./b 1 before: Mon,2020 12:56:41 PM
[2]+ Stopped ./b
./a 1 AFTER: Mon,2020 12:56:41 PM
./a 2 before: Mon,2020 12:56:41 PM
[1]+ Stopped ./a
./b 1 AFTER: Mon,2020 12:56:41 PM
./b 2 before: Mon,2020 12:56:41 PM
[2]+ Stopped ./b
./a 2 AFTER: Mon,2020 12:56:41 PM
./a 3 before: Mon,2020 12:56:41 PM
[1]+ Stopped ./a
./b 2 AFTER: Mon,2020 12:56:42 PM
./b 3 before: Mon,2020 12:56:42 PM
[2]+ Stopped ./b
./a 3 AFTER: Mon,2020 12:56:42 PM
[1]- Done ./a
./b 3 AFTER: Mon,2020 12:56:42 PM
[2]+ Done ./b
这会给stderr带来很多垃圾,但是您可以将其重定向。
$: { ./a;./b;wait; } >log 2>err
也许它将提供一些启发。
,解决此问题的最简单方法是将文件写入同一驱动器上的其他文件夹中,或具有不同的扩展名,以便您可以轻松地将其从选择中排除(例如,代替images/foo.jpg
,写入images/foo.jpg.temp
,并用*.jpg
列出,然后在完成时使用原子移动(mv images/foo.jpg.temp images/foo.jpg
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。