我有一个 cron 任务,用于处理客户通过 FTP 上传到我的 FreeBSD 服务器的文件。该 cron 任务每小时运行一次,通常处理每个文件只需几秒钟。
cron 作业会查看客户端的上传目录,并将所有新文件移至 tmp 目录。然后,它会处理这些文件并将其移至最终目录,然后公众便可通过网站访问这些文件。
问题是,每隔一段时间,cron 任务就会在新文件上传时运行。它会将半上传的文件移动到 tmp 目录,并尝试处理它,当然会失败。
问题:如何确定上传的文件是否完整?我能想到的唯一办法是检查文件大小以查看它是否在变化,但这似乎是一个临时解决方案。上传完成后是否会设置某种标志或其他东西?
答案1
最安全的方法是搜索您的 ftp 服务器日志以查找“传输完成”消息(取决于软件)。
如果这不可能,则仅处理在安全时间内(例如 10 分钟)未触碰的文件。使用find
获取这些文件的列表,例如 10 分钟内的文件,然后上传$UPLOAD_DIR
find $UPLOAD_DIR -amin +10
意思+
是“超过”。请参阅man 1 find
以了解更多信息。
答案2
fuser
可能会奏效。这可以让您查看哪些进程正在使用文件。只有在没有进程使用时才移动。
答案3
cron 任务是否创建了可识别的进程名?如果是,请使用 ps 和 grep 查看旧进程是否仍在运行。