当前位置: 首页 > 编程笔记 >

Docker Linux如何检测目录(或文件)变化来执行给定命令

戚阳
2023-03-14
本文向大家介绍Docker Linux如何检测目录(或文件)变化来执行给定命令,包括了Docker Linux如何检测目录(或文件)变化来执行给定命令的使用技巧和注意事项,需要的朋友参考一下

在此以PHP容器为例,当网站上传文件时,同步文件到云存储。

同步的方法很多,直接写在PHP网站代码中,或者用本章所讲的内容,利用Linux来侦测目录及目录下文件的变化,来异步实现文件同步。

首先,在Dockerfile或者容器中安装inotify:

apt-get install inotify-tools

然后,编写Bash脚本,并运行:

#############################################
# 在使用本脚本之前,请在环境变量中设置有事件发生
# 时执行的PHP脚本,如:
#   export INOTIFY_PHP_FILES=/var/www/html/awaimai.com/utils/oss.php
# 然后再执行本脚本:
#   /bin/bash inotify.sh
# 一旦配置的 DIR 目录发生变化,便会执行该PHP脚本,同时也传送信息到PHP脚本
#############################################

DIR="/var/www/html"                                     # 检测该目录下的文件动态,多个以空格隔开
EVENTS="create,close_write"                             # 仅目录和文件创建
FORMAT="%e %w%f"                                        # 输出内容格式为:事件 完整目录
OPTIONS="--recursive --monitor --excludei .*/tmp/.*"    # 递归侦测子目录,循环侦测,忽略包含/tmp/的路径

echo "=================="
echo "Inotify directory     :$DIR"
echo "Inotify events        :$EVENTS"
echo "Inotify format        :$FORMAT"
echo "Inotify options       :$OPTIONS"
echo "Inotify php file(s)   :$INOTIFY_PHP_FILES"


inotifywait ${OPTIONS} --format "${FORMAT}" -e "${EVENTS}" "${DIR}" | \
    while read -r notifies;                     # 侦测结果放入notifies变量
    do
       echo "$notifies";
        FILES=(${INOTIFY_PHP_FILES//,/ })       # 将PHP文件集以逗号分隔成数组
        for FILE in ${FILES[@]}
        do
            echo "===== Execute file ${FILE} =====\n"
            php ${FILE} $notifies;              # 调用PHP文件
        done
    done

实列 oss.php 文件:

echo '===== We are in the PHP file =====' . PHP_EOL;
$newFile = getFilePath();
echo "Detecting new file $newFile" . PHP_EOL;

function getFilePath()
{
    global $argv;
    if (!$argv || count($argv ) < 3) {
        print_r($argv);
        exit('Params from command line is invalid.');
    }

    $action = $argv[1];
    $path = $argv[2];

    if ($action !== 'CLOSE_WRITE,CLOSE') {
        exit('Ignore this action, we just monitor new file.');
    }

    return $path;
}

参考资料:

  1. inotify手册:https://linux.die.net/man/1/inotifywait
 类似资料:
  • 本文向大家介绍python监控文件或目录变化,包括了python监控文件或目录变化的使用技巧和注意事项,需要的朋友参考一下 本文实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。

  • 问题内容: 我需要知道如何使用Go检测文件何时更改。我知道Unix提供了一个名为named的函数,该函数会在更改特定文件时通知您,但我在Go中找不到此函数。请帮我。 问题答案: 目前这里有一个实验包。它应该像go1.3中那样合并到核心中

  • 具体而言, 在执行git status的时候, git到底做了什么? 目前在网上找到的疑似正确答案: git会调用系统函数lstat来读取文件属性, 从而判断文件的大小和修改时间是否有所改变; 于是, 假设某个文件修改后的大小正好和修改前一致, 然后在保存时又强制使用了和之前相同的修改时间来保存, 那么此时git是感知不到这一文件已经发生改变的。 经过个人测试, 发现确实如此, 所以该答案似乎是对

  • 我们将创建一个简单的来显示一个电影的信息。 这个应用程序将只包含两个组件:MovieComponent显示有关电影的信息和MainComponent,它使用按钮来保存对电影的引用以执行一些动作。 我们的AppComponent组件将有三个属性:应用程序的slogan,电影的title(标题)和(主角)。 最后两个属性将被传递到模板中引用的MovieComponent元素。 在上面的代码片段中,我们

  • 如何从“错误”目录运行类文件,例如,从子目录本身,或者从任何其他目录。 尽管有几个stackoverflow问题的标题表明它们解决了这个问题,但我发现没有一个这样做。

  • 我正在处理一个作为可执行jar运行的Spring Boot应用程序。在我的代码中,我试图检索运行的jar文件所在的文件夹。但是我发现了一些困难。我这样做了: 问题是,通过这种方式,打印输出是这样的: 这不是我所需要的,因为我需要包含jar文件的目录路径,int这个例子是这样的:/home/andrea/git/notartel-api-batch/target/ 怎么了?我错过了什么?如何尝试修复