![来自数千个文件的 JPG 滑动窗口](https://linux22.com/image/54247/%E6%9D%A5%E8%87%AA%E6%95%B0%E5%8D%83%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%20JPG%20%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3.png)
我的机器配有一个摄像头,每天可以拍摄数千张 jpg 文件。我正在寻找一种通过云存储站点(例如box.com
.
我认为每分钟将最后 5 分钟的文件复制到已安装的远程驱动器 (davfs2),然后每 10 分钟删除超过一小时的文件将是一个很好的解决方案;但这却引发了大问题!导致我的机器无法通过SSH连接;因此要求我将其关闭。
现在,即使我尝试删除这些文件,它仍然会将它们重新复制到已安装的驱动器中。我不得不卸载驱动器,但似乎无法清除 davfs2 缓存。
我的方法有根本问题吗?
我把它放在我的 crontab 中:
*/1 * * * * sudo find /mnt/ -type f -cmin -5 -exec cp -pn '{}' /home/pi/box/street_pictures/ \;
*/10 * * * * sudo find /home/pi/box/street_pictures -cmin +60 -type f -exec rm '{}' \;
/nmt
是包含数千张图片的文件夹。
/home/pi/box/street_pictures
是我安装的驱动器。
答案1
为什么sudo
?如果无论如何它都以 root 身份运行,请将其放入 root crontab 中?
扫描包含数千个文件的(远程)目录可能需要很长时间。如果花费的时间超过一分钟,则可能会同时运行多个 cron 作业,相互争夺资源,并且许多远程文件系统无法很好地处理并发访问。
为了避免并发 cron 作业,您可以使用某种锁定机制,或者因为它会不停地运行,所以您可以将其放在服务脚本中:
while [ 1 ]
do
sleep 60 &
cp jpg stuff
wait # for sleep in case 60 seconds have not yet passed
done
也许您可以将已复制的文件重命名到忽略的子目录?
-exec {} \;
也不是很有效(cp
为每个文件启动一个新进程)。-exec cp --target-directory=/home/pi/... {} +
如果您的程序支持这样的选项,请尝试改为。
如果文件名以任何方式可预测(包含日期或递增数字),则依赖它们而不是它们的时间戳可能更有效,以避免不必要/耗时的stat()
文件属性。