📌  相关文章
📜  linux bash 在文件更改时执行某些操作 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 14:43:54.847000             🧑  作者: Mango

Linux Bash 在文件更改时执行某些操作 - Shell-Bash

有时候我们需要在文件被修改时自动执行一些操作,例如自动编译代码、自动重启服务等。在 Linux 中,我们可以使用 Shell 脚本来实现此功能。本文将介绍如何使用 Bash Shell 在文件更改时执行某些操作。

inotify-tools

在 Linux 中,有一个叫做 inotify 的内核子系统,它可以监视文件系统中的文件或目录的变化,当文件或目录发生变化时会发送通知给用户空间的应用程序。inotify-tools 是基于 inotify 子系统的工具集,可以使用 inotify-tools 监视文件的变化并进行相应的操作。

安装 inotify-tools

在 Ubuntu 或 Debian 上,我们可以使用以下命令安装 inotify-tools:

sudo apt-get install inotify-tools

在 CentOS 或 RedHat 上,我们可以使用以下命令安装 inotify-tools:

sudo yum install inotify-tools
使用 inotifywait 监视文件变化

inotifywait 是 inotify-tools 工具集中的一个命令行工具,用于监视文件或目录的变化。

以下是 inotifywait 的基本用法:

inotifywait [options] path
  • options:可选参数。
  • path:要监视的文件或目录。

以下是一些常用的选项:

  • -r:递归监视子目录。
  • -e:指定要监视的事件类型,可使用逗号分隔多个类型,常用的有 modify(文件被修改)、create(文件被创建)、delete(文件被删除)等。
  • -m:持续监视。

以下命令将监视当前目录下所有的 .txt 文件,当文件被修改时将打印文件名:

inotifywait -m -e modify --format "%w%f" *.txt
在文件更改时执行命令

当我们需要在文件被修改时执行某些操作时,可以结合 inotifywait 和 Bash Shell 编写一个 Shell 脚本来实现。

以下是一个示例脚本 watch.sh,当 test.txt 被修改时将执行 echo 'test.txt has been modified' 命令:

#!/bin/bash

while inotifywait -e modify test.txt; do
  echo 'test.txt has been modified'
done

使用以下命令运行脚本:

chmod +x watch.sh
./watch.sh

test.txt 文件被修改时,将会看到类似以下输出:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
test.txt has been modified
test.txt has been modified
...
编写更复杂的脚本

上面的示例脚本只执行了一个简单的命令,当需要执行更复杂的操作时,可以在脚本中加入更多的代码。

以下是一个示例脚本 restart.sh,当 app.js 文件被修改时将自动重启 Node.js 服务器:

#!/bin/bash

while inotifywait -r -e modify ./; do
  if [[ $(pidof node) ]]; then
    echo 'Stopping Node.js server...'
    killall node
    echo 'Node.js server stopped'
  fi

  echo 'Starting Node.js server...'
  node app.js > /dev/null 2>&1 &
  echo 'Node.js server started'
done

使用以下命令运行脚本:

chmod +x restart.sh
./restart.sh

app.js 文件被修改时,将会自动重启 Node.js 服务器。

结论

Bash Shell 提供了很多强大的功能,结合 inotify-tools 可以实现在文件更改时自动执行某些操作的功能。在编写脚本时,需要注意处理异常情况,防止脚本出错导致系统异常。