inotifywait shell 脚本作为守护进程运行

Posted

技术标签:

【中文标题】inotifywait shell 脚本作为守护进程运行【英文标题】:inotifywait shell script run as daemon 【发布时间】: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 所指出的,代码从未运行过。如果您将此设置为答案,我会将其标记为正确的。 我在下面添加了答案。很高兴为您提供帮助! 【参考方案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 不会递归地查看目录,所以这就是我没有尝试的原因。我会试试你的解决方案,看看。谢谢。

以上是关于inotifywait shell 脚本作为守护进程运行的主要内容,如果未能解决你的问题,请参考以下文章

inotifywait 运行守护程序模式给出错误无法初始化 inotify

用shell写一个守护进程脚本

Linux inotifywait常用参数说明

inotifywait命令常用参数 Linux周末学习

shell 脚本实现的 deamon 守护进程

openwrt 实现对shell脚本的守护处理