使用 inotifywait 监视多个目录并运行脚本

Posted

技术标签:

【中文标题】使用 inotifywait 监视多个目录并运行脚本【英文标题】:watch multiple directories using inotifywait and run scripts 【发布时间】:2012-12-04 09:24:32 【问题描述】:

我有多个包含网站的 git 存储库。我想针对他们克隆的本地版本运行 inotifywait 以监控某些文件事件,并在检测到这些事件时自动运行 git push 和 git pull 脚本。

到目前为止,我已经为每个目录创建了一个包含单独函数的脚本,但只有第一个函数被调用。

  #!/usr/bin/env bash

  dbg() 
  inotifywait -mr -e ATTRIB /path/to/dbg/ |
  while read dir ev file;
  do
  cd /path/to/dbg
  git pull;
  git add .;
  git commit -m " something regarding this website has changed. check .... for more        info";
  git push;
  ssh remote@server.com 'cd /path/to/web/root; git pull';
  done;
  
  dbg;

  website2() 
  same thing as above
  
  website2;

  website3() 
  same thing as above
  
  website3;

  .......

  website10() 
  ........
  
  website10;

我怎样才能使这段代码更高效、更重要、更全面,而无需创建和管理 10 个单独的脚本。 我真的很想把这个逻辑放在一个文件中,我希望这是一个模块来实现一个更大的项目。

请批评我的提问、我的语法、思维过程等,以便我改进。 谢谢。

【问题讨论】:

【参考方案1】:

如果你的逻辑相同,你可以使用 bash 函数来避免复制。此外,提交消息也可以作为参数传递。 试试这个

#!/usr/bin/env bash

dbg() 
dbg_dir=$1
webroot_dir=$2
inotifywait -mr -e ATTRIB $dbg_dir |
while read dir ev file;
do
cd /path/to/dbg
git pull;
git add .;
git commit -m " something regarding this website has changed. check .... for more        info";
git push;
ssh remote@server.com 'cd $webroot_dir; git pull';
done;

dbg /path/to/dbg /path/to/webroot1 &  # & will run the command in background
dbg /path/to/dbg2 /path/to/webroot2 &
dbg /path/to/dbg3 /path/to/webroot3 &

【讨论】:

以上是关于使用 inotifywait 监视多个目录并运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

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

将文件夹添加到监视目录时不会触发 inotifywait close_write

Inotifywait 用于大目录

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

在运行脚本之前使用 inotifywait (或替代方法)等待 rsync 传输完成?

Linux inotifywait常用参数说明