【问题标题】:bash -- execute command on file change; doubling issue + how to skip loop until command completesbash -- 在文件更改时执行命令;加倍问题+如何在命令完成之前跳过循环
【发布时间】:2021-06-19 21:22:00
【问题描述】:

我是bash 菜鸟,我正在尝试为我正在使用inotifywait 进行的项目设置一种“热重载”功能。 Ubuntu 20.04 如果这很重要。

这就是我希望的工作:

inotifywait -m -r ../.. -e modify,create,delete |
    while read line; do
        custom_command
    done

我有两个问题:

问题 #1custom_command 需要一些时间才能工作,因此如果我同时对目录进行更多更改,custom command 似乎会“排队”custom_command ,我真的只是希望它保留最新的并丢弃其他的。

问题 #2 是我得到了某种“双重输出”。例如,如果我 bash auto-exec.shauto-exec.sh 看起来像这样:

inotifywait -m -r . -q -e modify,create,delete

然后每次注册更改时,我都会将其作为输出(不是错误,它加倍 - 每次修改时我都会得到两条相同的行):

./ MODIFY auto-exec-testfile.txt
./ MODIFY auto-exec-testfile.txt

我应该注意我已经尝试使用 Visual Code Studio 和 gedit 进行更改,结果相同。

如果我像这样修改bash 文件:

inotifywait -m -r . -q -e modify,create,delete |
    while read line; do
        echo "$line"
        echo "..."
    done

每次发生变化时,我都会得到以下输出:

./ MODIFY auto-exec-testfile.txt
...
./ MODIFY auto-exec-testfile.txt
...

如果我将bash_test.sh 修改为以下内容:

inotifywait -m -r . -q -e modify,create,delete |
    while read line; do
        echo "help me..."
    done

然后每次进行更改时我都会得到以下信息:

help me...
help me...

./ MODIFY ... 行发生了什么? 想必我对 bash、stdout 或这里的类似/相关概念有些不理解?

最后,如果我将.sh 文件更改为以下内容:

inotifywait -m -r . -q -q -e modify,create,delete |
    while read _; do
        echo "help me..."
    done

然后我根本没有输出。这个我想我明白了,因为-q -q意味着inotifywait"super silent" mode中,所以没有日志,因此没有什么可以触发while

我想做的只是在发生变化时触发代码一次,然后删除除最近执行之外的所有代码。我不确定使用while 这样做是否完全有必要,但我尝试了inotifywait -m -r . -q -q -e modify,create,delete | echo "help me..",并且脚本在启动时打印了一次“帮助我...”,然后在修改时退出。

非常感谢您的帮助。

编辑 - 20201 年 3 月 23 日 我从inotifywait 行中删除了-mcreate,它似乎按预期工作,只是它不会在监控模式下保持“启动”状态。所以这至少只给了我一个来自inotifywait的条目:

notifywait -r .. -q -e modify,delete |
    while read line1; do
        echo ${line1}
    done

相关:

  1. inotifywait - pause monitoring while executing command
  2. https://unix.stackexchange.com/questions/140679/using-inotify-to-monitor-a-directory-but-not-working-100
  3. inotifywait not performing the while loop in bash script

【问题讨论】:

  • 您可以在 inotify 选项中添加 --format '%e %f' 以查看记录了哪个事件。
  • 很难说你想要什么。如果您只想要 1 个事件,请不要使用 -m
  • 多行可能是多个inotify进程运行造成的。也许在每次新尝试使此工作解决该问题之前执行killall inotifywait(或将其作为第一件事放在脚本中)。
  • 确实,当使用 -q 调用 inotifywait 时,您不会得到任何输出,因此 read 将永远不会得到任何东西,因此永远不会返回,并且您的脚本是只是看似坐在那里,显然什么都不做。
  • 在我的最后一条评论中写上-qq

标签: linux bash while-loop inotify inotifywait


【解决方案1】:
while inotifywait -e close_write,delete .; do 
    pkill custom_command
    custom_command&
done

【讨论】:

  • 纯代码答案没有帮助。请为您的所有答案添加上下文和解释,以使其对其他用户有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2018-04-03
  • 2019-12-31
相关资源
最近更新 更多