删除正在使用的文件

删除正在使用的文件

我有一个接收视频文件(RAW)并将其转码的进程FFMPEG生成三个(不同分辨率)结果文件。我正在使用分布式任务队列系统(芹菜)在不同的异步任务中处理 FFMPEG 的每个进程。

三个任务按照流程运行

  • 转换视频
  • 将结果上传至云端存储桶
  • 删除结果

最后一个任务将原始视频(用于转码)上传到存储桶,然后将其删除。

如果我异步启动这三个任务,然后立即删除 RAW 文件,那么(正在使用 RAW 文件的)任务是否会因删除文件而中断?

PS:我假设,RAW文件被加载到内存中,并打开3次,同时转码任务开始。

答案1

完整的 RAW 文件位于内存中的假设是不正确的。通常,当打开文件时,进程会获取可用于读/写文件的文件描述符。

当一个文件被一个进程打开,然后在该文件仍然打开时被删除,实际上并不会立即删除该文件。当不再有进程拥有该文件的句柄(文件描述符)时,该文件实际上被删除。您可以使用它lsof来查看文件是否仍然具有句柄,并且当您删除此类文件时,它通常会列出并附(deleted)加到该行的文本。

删除打开的文件时也不会回收磁盘空间,因此只要文件处于打开状态,仍然可以安全地使用该文件。当删除的文件不再具有活动文件描述符时,文件系统将回收消耗的磁盘空间。

答案2

如果在删除输入文件之前所有三个 ffmpeg 进程都已打开该文件,那么这很可能会起作用。但是,如果 ffmpeg 关闭文件并重新打开它,则会失败。如果您可以确定 ffmpeg 不会这样做,那么您可能是安全的。

相关内容