AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 50127
Accepted
GeneQ
GeneQ
Asked: 2009-08-05 17:45:42 +0800 CST2009-08-05 17:45:42 +0800 CST 2009-08-05 17:45:42 +0800 CST

Linux中目录内容发生变化时如何自动运行脚本?

  • 772

每当将新文件复制到特定目录时,我想自动运行脚本。换句话说,在 Linux 中有没有办法“监视”目录的变化,然后运行一些东西来响应变化?

linux scripting inotify
  • 5 5 个回答
  • 26323 Views

5 个回答

  • Voted
  1. Best Answer
    MikeyB
    2009-08-05T18:01:00+08:002009-08-05T18:01:00+08:00

    如果您有幸使用基于 debian 的发行版,apt-get install dnotify. 其他发行版可能有类似的东西 - 寻找dnotify名称。

    dnotify 是一个基于 Linux 内核 2.4.19+ 的 dnotify API 的简单程序。dnotify 可以在每次特定目录的内容发生变化时执行指定的命令。它从命令行运行并接受两个参数:一个或多个要监视的目录和一个在目录更改时执行的命令。选项控制要触发的事件:何时在目录中读取文件,何时创建、删除文件等等。

    如果您想在自己的程序中处理此问题,dnotify 也是您要使用的 API。

    • 17
  2. user7119
    2009-08-06T04:01:25+08:002009-08-06T04:01:25+08:00

    您可以使用 inotify-tools 运行脚本,类似这样。它将监视目录中已修改文件、新文件和已删除文件的更改,然后执行脚本。

    #!/bin/sh
    while inotifywait -e modify -e create -e delete /home/me/code; do
        rsync [options] /home/me/code/ /media/nfs/code/ 
    done
    
    • 12
  3. Andrew Ferrier
    2010-05-25T09:15:46+08:002010-05-25T09:15:46+08:00

    我认为, incron基本上是您想要的。它使用 inotify 作为通知机制(正如其他人指出的那样,它取代了 dnotify),但不需要使用 inotifywait 或类似方法连续运行的脚本(尽管显然 incron 守护程序一直在运行)。系统范围的 'crontabs' 和用户 'crontabs' 的支持方式与标准 cron 类似,但不是将时间指定为触发器,而是使用 inotify 事件和文件/目录名称。

    我相信,incron 已为许多发行版打包,包括 Ubuntu 和 Debian。

    • 4
  4. DukeLion
    2013-08-15T20:53:53+08:002013-08-15T20:53:53+08:00

    有一个专门用于此目的的软件,autoenv 你可能想检查一下。

    • 0
  5. clacke
    2016-07-22T02:45:07+08:002016-07-22T02:45:07+08:00

    entr是我见过的最简单、最可组合的文件通知工具。它的使用针对查看文件而不是目录进行了优化,但它也可以解决您的问题。

    要检测并处理添加的文件,请将其与其他工具(例如make. entr不发送名称或类似的东西,它只是运行你告诉它运行的东西。

    要检查目录中添加的文件:

    ## entr exits with rc=0 when terminated
    ## rc=1 when watched files go away or don't exist to begin with
    ## rc=2 when new files arrive in watched directories
    until echo /path/to/directory_to_watch | entr -d do_stuff
    do sleep 1; done
    

    如果您还想在现有文件更改时采取行动:

    ## Here's why it comes in handy that entr exits when new files are added --
    ## find gets re-run.
    until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
        entr -d do_stuff
    do sleep 1; done
    

    ...这就是循环机制派上用场的地方,因为find如果添加了文件,表达式将再次运行。

    如果您想要更好的错误处理并希望确保每个添加/删除的文件只运行一次,事情会变得有点古怪,但对于这些简单的情况来说,它很棒。


    编辑:如果您想在系统级别执行此操作,例如incron,只需将脚本添加到您最喜欢的进程管理器(例如s6、runit、systemd或sysvinit并跳过循环:

    #!/bin/bash
    exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
    

    和exec进程替换 ( <(...)) 在从进程管理器运行时很重要,以正确处理信号(即让 shell 不碍事)。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve