【问题标题】:Constantly scanning directory for special files to save them upon appearance不断扫描目录中的特殊文件以在出现时保存它们
【发布时间】:2016-07-24 06:05:48
【问题描述】:

在运行量子化学程序时,我必须处理一些问题。该程序在运行时似乎会创建两个重要文件,但使用后又直接将其删除。这些文件对于获得支持很重要。但是它们被删除得太快了,我无法手动复制它们。

因为似乎没有办法告诉程序它应该保存这些文件,所以我正在考虑一个小脚本,它会不断扫描工作目录中的这些文件。创建它们后,我希望该程序将它们复制到另一个目录或只是复制到另一个文件名。

尽管我给出了这个问题的标签,“CentOS release 6.3 (Final)”-没有特殊权限的普通用户可以访问的任何编程语言都可以。


我正在考虑通过包含 find -name ... 的 while 循环来执行此操作,并在找到/复制文件时回显。但这种方法对我来说似乎很愚蠢,我希望对更好的解决方案提供一些意见。

我要保存的文件是filename.gcp.in.tmpfilename.gcp.out.tmp

【问题讨论】:

  • “永久”是指“不断”吗?
  • @khelwood 确实......对不起。

标签: python bash centos


【解决方案1】:

您可以为此使用 inotify 和 it seems to be built into CentOS 6.3

例如(取自a tutorial where you'll find more details):

while true #run indefinitely
do 
inotifywait -r -e modify,attrib,close_write,move,create,delete /dir && /bin/bash backup-script
done

backup-script 是你用来验证你想要的文件的创建并将它们复制到其他地方的任何东西。你也可以使用incron

【讨论】:

  • 感谢您向我展示此内容,但使用控制台中的inotifywait 告诉我找不到它。可能我需要安装它(?)这是不可能的。
  • 你可能需要安装 inotify-tools 包,但我只是注意到在教程中我链接到他们从 EPEL 存储库安装它。
【解决方案2】:

获取临时文件的一个有用技巧是创建指向它们的硬链接。这比复制效果更好,因为临时文件有多大并不重要,并且在文件完成之前复制没有丢失某些内容的危险。当创建临时文件的程序将其删除时,硬链接会被留下。

如果您事先不知道临时文件的名称,并且无法使用inotify,则一种可能的方法是在创建文件的目录中运行此轮询循环:

while : ; do
    for tmpfile in *.gcp.in.tmp *.gcp.out.tmp ; do
        [[ -e $tmpfile ]] || continue
        backupfile=$tmpfile.bak
        [[ -e $backupfile ]] || ln -- "$tmpfile" "$backupfile"
    done
done

如果您事先知道文件名,并且创建它们的程序只是打开它们以进行写入、关闭它们并删除它们,那么您可以不使用循环。在运行程序之前执行此操作:

touch filename.gcp.in.tmp filename.gcp.out.tmp
ln filename.gcp.in.tmp filename.gcp.in.tmp.bak
ln filename.gcp.out.tmp filename.gcp.out.tmp.bak

程序运行完毕后,临时文件的内容应该在.bak文件中。

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 2012-02-10
    • 2017-07-21
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多