我有两个单独的目录。用户将文件加载到第一个文件中。有一个 cronjob 在后台运行,每 5 分钟将文件复制到第二个目录。
如果用户尚未完成上传并且 cronjob 复制了文件,会发生什么情况?请注意,这两个目录由不同的用户拥有,cronjob 以 root 身份执行。
答案1
cp
不知道打开的文件。因此,如果第一个用户上传大文件并且 cronjob(或任何其他进程)开始复制该文件,它只会复制已写入的内容。您可以这样考虑 -cp
复制磁盘上当前的内容,无论文件是否完整。否则,您将无法复制日志文件等。
答案2
cp
不知道其他程序可能会打开这些文件。里面没有什么魔法cp
。 unix 的设计有意避免对文件设置任何类型的锁,除非有令人信服的理由(令人信服的意思是内核需要它)。关于这个主题,请参阅将输出重定向到文件是否会对该文件应用锁定?
文件由生产者生成,完成后由消费者使用的情况很常见。处理这个问题的通常方法是让生产者编写一个消费者不会查找的临时文件,然后一旦生产者完成,将文件移动到消费者可以找到的地方。移动文件(在同一文件系统上)是一个原子操作:在某个时刻,对于使用者来说,文件从不存在变为存在。
因此,请安排您的上传作业在完成上传后将文件移动到其他目录。将 cron 作业指向这个不同的目录。
答案3
看来您想做一个目录同步工作。
因为-u,--更新的选项cp
仅当源文件比目标文件新或目标文件丢失时才复制
因此,您可以添加一个 cronjob,例如cp -auv SOURCEDIR/* DESTDIR
它将复制那些修改时间已更改的文件。这意味着DESTDIR
上传完成后最终将获得完整的副本。
rsync
可以做同样的工作。例如,rsync -av SOURCEDIR/ DESTDIR
。
尽管应用了-a选项,但某些指定的属性(例如所有权)只能由超级用户保留。
详情man cp
请参阅。man rsync