【问题标题】:inotifywait shell script run as daemoninotifywait shell 脚本作为守护进程运行
【发布时间】:2018-01-16 00:26:54
【问题描述】:

我有一个脚本可以(递归地)监视目录并在文件更改时执行命令。当监控标志如下使用时,这可以正常工作:

#!/bin/sh

inotifywait -m -r /path/to/directory |
    while read path action file; do
            if [ <perform a check> ]
            then
                my_command
            fi
    done

但是,我想在启动时和后台运行它,所以天真地认为我可以将 -m 标志更改为 -d(将 inotifywait 作为守护进程运行,并包含 --outfile 位置),然后将其添加到 rc .local 在启动时运行。我哪里错了?

【问题讨论】:

  • 在您的/etc/rc.local 文件中,您是否在末尾使用单个&amp; 调用脚本?
  • @Jebby - 这正是我需要做的。谢谢!运行 inotifywait 作为守护进程是一个红鲱鱼,正如下面的 tink 所指出的,代码从未运行过。如果您将此设置为答案,我会将其标记为正确的。
  • 我在下面添加了答案。很高兴为您提供帮助!

标签: linux shell sh inotify inotifywait


【解决方案1】:

嗯 .... 使用 -d 将自身设置为背景并将 ONLY 输出到 outfile,因此您的整个管道和循环构造没有实际意义,并且它永远不会看到任何数据.

【讨论】:

  • 谢谢,这就解释了。这是否意味着 inotifywait 只能使用 -d 标志记录更改?发生变化后是否可以触发动作?
  • @Nicholas :不,不是那个意思。但是,如果您指定 --outfile 它不会输出任何内容,而是将调试信息输出到标准输出。如果你想与输出交互 AND 有一个日志,只需使用 tee ... ` inotifywait -m -r /path/to/directory | tee -a ~/通知 |而...`
  • 啊,我明白了,现在这更有意义了。我实现了上面需要的东西,但是使用 inotifywait 守护进程标志将是一个更优雅的解决方案。我将使用 tee 来尝试一下。非常感谢您的帮助!
  • 非常欢迎。您可以拆分处理,守护 inotifywait 并在第二步中读取日志,但这会引入 a) 更多复杂性和 b) 启动时的潜在时间问题。 KISS 方法并使用 tee 来达到预期目的没有任何问题;}
【解决方案2】:

您需要在/etc/rc.local 的命令末尾添加一个&amp;

在命令末尾添加一个&amp; 意味着在后台运行此程序,以便用户仍然可以输入。

【讨论】:

    【解决方案3】:

    Incron 是一个类似于 cron 的守护进程,用于 inotify 事件。

    只需使用incrontab 和您的任务条目:

    /path/to/directory IN_ALL_EVENTS /usr/local/bin/my-script $@ $# $%
    

    /local/bin/my-script 将是:

    #! /bin/bash
    local path=$1
    local action=$2
    local file=$3
    if [ <perform a check> ]
    then
      my_command 
    fi
    

    【讨论】:

    • 这并没有回答他的问题,也没有提供替代解决方案。
    • 现在好点了吗?
    • 我读过 Incron 不会递归地查看目录,所以这就是我没有尝试的原因。我会试试你的解决方案,看看。谢谢。
    猜你喜欢
    • 2011-01-03
    • 2013-10-14
    • 2023-03-02
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多