我正在 Ubuntu 桌面系统上设置我的第一个 cron。我很想知道是否有办法在 cron 运行之前锁定文件夹以及如何设置它?我正在关注这文章。我只是想确保在将文件移出或移至 cron 文件夹时不会损坏任何文件,因为它位于共享网络上。
答案1
一个简单的脚本,在访问文件之前具有锁定和延迟:
#!/bin/sh
if mkdir /tmp/myscript-running; then
cd /mnt/share/whereever
find . -type f -mmin +1 -print0 | xargs -i -n 1 -0 myscript.sh "{}"
rmdir /tmp/myscript-running
else
: # previous instance still running, do nothing
fi
find
该选项需要GNU或同等版本-mmin
。您可以根据需要通过 cron 运行此命令。替换myscript.sh
为您的处理脚本。
主要特点是:
- 用于
mkdir
创建锁定目录以防止实例重叠 - 使用
find
with-mmin +1
将输出限制为超过 1 分钟前修改的文件,这是为了尝试确保新文件被完全复制 - 用于
xargs
一次处理一个文件,"{}"
用文件名替换 - 使用
\0
终止的文件名,find | xargs
这样麻烦的文件名就不会引起问题
您应该能够修改find
参数以满足您的需要。您还可以使用上述逻辑将完成的文件从“ uploading/
”目录移动到“ ready/
”目录,这可能会简化事情。
Ubuntu 也有 和lockfile
,shlock
它可能很有用,请参阅后者的手册页以获取更多想法。
答案2
这并不理想,但很有效。当将新文件复制到网络上时,您有一个单独的“馈送”目录,可以将新文件复制到该目录中。然后,您的 cron 脚本可以执行 /var/feeder 的 /ls,然后执行该目录中每个文件的 ls,查找任何打开的文件句柄。然后,未使用的文件将移至主共享目录中,打开的文件(假设您正在复制它们或某些此类文件)将留在馈送器中。确保主 /shared 目录除了您的脚本之外不可写,并且您应该没问题。