📅  最后修改于: 2023-12-03 14:43:54.847000             🧑  作者: Mango
有时候我们需要在文件被修改时自动执行一些操作,例如自动编译代码、自动重启服务等。在 Linux 中,我们可以使用 Shell 脚本来实现此功能。本文将介绍如何使用 Bash Shell 在文件更改时执行某些操作。
在 Linux 中,有一个叫做 inotify 的内核子系统,它可以监视文件系统中的文件或目录的变化,当文件或目录发生变化时会发送通知给用户空间的应用程序。inotify-tools 是基于 inotify 子系统的工具集,可以使用 inotify-tools 监视文件的变化并进行相应的操作。
在 Ubuntu 或 Debian 上,我们可以使用以下命令安装 inotify-tools:
sudo apt-get install inotify-tools
在 CentOS 或 RedHat 上,我们可以使用以下命令安装 inotify-tools:
sudo yum install inotify-tools
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 可以实现在文件更改时自动执行某些操作的功能。在编写脚本时,需要注意处理异常情况,防止脚本出错导致系统异常。