inotifywait 未在 bash 脚本中执行 while 循环

Posted

技术标签:

【中文标题】inotifywait 未在 bash 脚本中执行 while 循环【英文标题】:inotifywait not performing the while loop in bash script 【发布时间】:2019-04-23 14:03:17 【问题描述】:

我想在我的 Docker 容器中的目录上放置一个文件观察器。我正在使用entrypoint.sh 脚本来设置放置文件观察器的脚本。设置是这样的:

#!/bin/sh

# Trigger the script with the file watcher in the background
./bin/watcher.sh &

watcher.sh 脚本包含inotifywait 命令:

#!/bin/sh

inotifywait \
    --event create --event delete \
    --event modify --event move \
    --format "%e %w%f" \
    --monitor --outfile '/var/log/inotifywait.log' \
    --syslog --quiet --recursive \
    /etc/haproxy |
while read CHANGED;
do
    echo "$CHANGED"
    haproxy -W -db -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) &
done

但是,虽然当我检查top 时会列出观察程序,并且它会报告定义的日志文件中的更改,但循环永远不会触发。我试过用简单的方法调试循环:

    touch /var/log/special.log
    echo "$CHANGED" >> /var/log/special.log

但是文件永远不会被创建,并且没有任何内容被回显。在 bash 脚本中使用 inotifywait 与循环的正确方法是什么?

【问题讨论】:

【参考方案1】:

您使用--outfile 选项将输出显式发送到文件而不是stdout。从来没有向stdout 写入任何内容,因此while 循环中的read 语句从不读取任何数据。

你可能想要:

inotifywait \
    --event create --event delete \
    --event modify --event move \
    --format "%e %w%f" \
    --monitor \
    --syslog --quiet --recursive \
    /etc/haproxy |
while read CHANGED;
do
    echo "$CHANGED"
    haproxy -W -db -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) &
done

【讨论】:

当我删除 --outfile 时仍然没有任何反应。奇怪的是,当我删除 outfile 并尝试触发 inotifywait 时,在第一次“执行”之后,当我使用 top 列出进程时它就消失了。 sorry,能用,是我的错,我刚刚注释掉了,sh有问题,但是我删了,就正常触发了。

以上是关于inotifywait 未在 bash 脚本中执行 while 循环的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本未在 Cron 中正确执行

bash 脚本 inotifywait 在继续之前等待文件完全写入

`inotifywait` 不会在带有 `-e delete_self` 的 bash 脚本中终止;但在交互式外壳中

在 bash 中使用 inotifywait 监视文件夹以进行队列

通过 FTP 将文件添加到 git 存储库时,在脚本中使用 inotifywait 自动执行 git 提交

如何判断字符串是不是未在 Bash shell 脚本中定义