1

在 Linux shell 中,我想将文件夹视为一袋文件。有一些进程将文件放入此包中。只有一个进程处于以下两种状态之一:

  1. 处理文档,然后将其删除
  2. 等待文件夹中存在任意文档,然后对其进行处理

处理文档的顺序或名称无关紧要。

在 bash 中,从文件夹中获取文件的独特过程是什么样的?处理意味着以文件名作为参数调用另一个程序。

请注意,在我手动执行此操作之前,这个独特的过程不会终止。

4

4 回答 4

2

您可以使用incrond,它代表“inotify cron daemon”。它是在后台运行并监视表中指定的目录的守护程序。可以创建一个有效的配置

incrontab -e

这将打开一个编辑器,您可以输入要观看的目录和操作,例如,

/path/to/observed/directory IN_CREATE,IN_MOVED_TO <command> $@/$#

<command>IN_CREATE,IN_MOVED_TO是在触发事件之一 ( ) 时要执行的命令或脚本。$@/$#是创建或移动到监视文件夹的文件的路径,并将传递给<command>. 这基本上就是您开始观看文件夹所需要做的一切。

您必须通过告诉它哪些用户可以使用该服务来初始化一次 incrond。您可以通过将用户添加到 来允许用户使用 incrond incrond.allow,例如,

echo 'root' >> /etc/incrond.allow
echo '<username>' >> /etc/incrond.allow

注意,那root也必须在incrond.allow. 现在您可以通过简单地调用来启动守护进程

incrond

更多信息incrond

于 2016-07-04T14:42:03.770 回答
1

inotify-tools是获取目录更改即时通知的理想工具。收到新文件创建的通知后,您可以对其进行处理和删除。

于 2016-07-04T14:03:38.073 回答
0

最简单的方法可能是遍历文件,“调用”处理程序并删除文件:

for f in /path/to/folder/*; do
    program_that_processes_file $f
    rm $f
done

但这有一个小问题:如果创建文件的程序没有自动执行,您可以处理甚至删除尚未完全编写的文件。最简单的解决方案是让作者写入一个临时目录,然后当文件完成后,将其移动到最终目标目录。

于 2016-07-04T14:02:29.460 回答
0

这个怎么样:

while true; do
    files=( $(ls) );
    if [[ ${#files[@]} -eq 0 || (`lsof -c write_process -- ${files[0]}`)]]; then
        sleep 5;
    else
        process ${files[0]};
        rm ${files[0]};
    fi;
done

...或者这个(可能不健康):

while true; do
    files=( $(ls) );
    if [ ${#files[@]} -ne 0 && ! (`lsof -c write_process -- ${files[0]}`)]; then
        process ${files[0]};
        rm ${files[0]};
    fi;
done

正如所指出的,我必须确保文件完全写入文件夹。我通过在 lsof 上检查写入文件的进程来做到这一点。但是,我还不确定如何将同一程序的多次执行处理为一个进程......

于 2016-07-05T09:55:54.027 回答