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
文件中,您是否在末尾使用单个&
调用脚本?
@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
的命令末尾添加一个&
在命令末尾添加一个&
意味着在后台运行此程序,以便用户仍然可以输入。
【讨论】:
【参考方案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 脚本作为守护进程运行的主要内容,如果未能解决你的问题,请参考以下文章