我正在尝试解决我的 YARN 问题。当任务提交到 YARN 时,它会创建包含所有所需设置和脚本的新目录。完成此任务后,目录将被删除。
我的任务在 0-2 秒后失败,因此文件被删除得太快,我无法保存它们。在运行任务之前我也不知道文件的确切名称(有自动增量计数器),但我知道父目录,并且我可以尝试猜测确切的路径。
我想以某种方式保护或复制这个文件(整个目录)。我想我可以设置 cron 每秒运行一次并复制父目录(我不知道文件大小是否不会超出cp
容量)。我可能还可以(每秒)将目录中的每个文件更改为只读模式(但它可能会干扰 YARN 进程并产生新问题)。我无法更改目录的权限 - YARN 无法首先创建它们。
有更好的解决方案吗? (YARN 细节并不重要,但也许有人知道如何使用一些我不知道的 YARN 功能)。
答案1
你的一些想法是行不通的。
- Cron 仅以分钟间隔运行。
- 将文件设置为只读并不能阻止删除。
- 将目录设置为只读可以防止删除,但也可以创建。
- 另一方面,文件的大小不会超出
cp
其容量。
最好的解决方案是找到一种方法来禁用临时文件的删除。
如果这不起作用,最好的方法不是复制,而是链接文件。如果您知道将在其中创建文件的目录,请在第二个 shell 中使用它:
while true; do
ln sourcedir/* targetdir &> /dev/null
done
完成后您必须终止此操作。sourcedir
并且targetdir
必须位于同一文件系统上。这将为每个文件创建一个硬链接。当再次运行时,目标存在,因此会显示错误消息,从而重定向到/dev/null
.除非源中的文件很快被删除,否则您应该将所有文件都放在目标目录中。
编辑
对于有限数量的嵌套目录,请使用
ln sourcedir/* sourcedir/*/* sourcedir/*/*/* targetdir &> /dev/null
对于任意级别的嵌套,请使用 find
find sourcedir -type f -exec ln --target-directory targetdir {} +