标签: inotify

inotify - 如何找出哪个用户修改了文件?

我正在寻找有关如何找出哪个用户修改了特定文件的指导.虽然inotify非常适合在触摸特定文件时获取通知,但我如何确定哪个用户修改了该文件?我可以想到使用lsof,但我担心它可能不像我想要的那样"实时"和/或它可能对资源征税太多.实时,我的意思是,如果用户只是touch在文件上执行命令,那么当我lsof在文件上运行时,它可能无法被提取lsof.

linux filesystems filestream inotify

8
推荐指数
1
解决办法
1万
查看次数

如何监控大文件的哪个部分发生了变化

是否有针对Linux kernel-3.0(或更高版本)的解决方案,允许用户获取类似于inotify描述已更改的特定文件段的通知?

fschange针对kernel-2.6.21的补丁.有没有最新的解决方案?最近是否fanotify能够提供功能?

linux inotify large-files

8
推荐指数
1
解决办法
398
查看次数

在C中的inotify文件

我试图在C中运行inotify的例子但是它不起作用.我想监视对文件的修改(文件是tmp.cfg),但它不起作用..我不知道我是否正确运行它,因为我了解如何监视目录,但不是一个file这是一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>
#include <unistd.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main( int argc, char **argv )
{
  int length, i = 0;
  int fd;
  int wd;
  char buffer[BUF_LEN];

  fd = inotify_init();

  if ( fd < 0 ) {
    perror( "inotify_init" );
  }

  wd = inotify_add_watch( fd, "/home/name/tmp.cfg",
                         IN_MODIFY | IN_CREATE | IN_DELETE );
  length = read( fd, buffer, …
Run Code Online (Sandbox Code Playgroud)

c inotify

8
推荐指数
3
解决办法
1万
查看次数

在CentOS 6.4下运行但不执行命令

我已经从EPEL存储库安装了incron(在你问之前;是的,我也尝试下载源代码并在本地编译;相同的结果)并且我试图在我的CentOS 6.4(最终)虚拟盒子上设置一个我成功制作原型的过程在我当地的Ubunto 12.04机器上:

预先提供的一些信息:

  • SELinux设置为PERMISSIVE
  • 我已经使用NOPASSWD添加了我的脚本和调用可执行文件来visudo解决一些权限问题...

如果我从命令行调用我的脚本,sudo /path/to/my/script.sh arguments它就像一个魅力.

sudo service incrond status验证incrond正在运行.root和myusername被添加到/etc/incron.allow,/etc/incron.deny为空.

我对root的incrotab是:

/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#
Run Code Online (Sandbox Code Playgroud)

事件/path/to/dropfolder/导致完全没有发生.不会生成任何日志,也不会对文件夹中的文件执行任何操作.

所以我研究过:建议cron在最小的环境中运行并执行复杂的命令/脚本,您可能必须.bashrc在cron命令的开头执行和/或导出PATH.

注意:我发现没有文档支持incron也可以在最小的环境中运行,但是由于我的google-fu(和bing-fu!)未能产生任何直接与incron我相关的有用结果WTH,我会试试!

编辑:文档表明incron从系统表或root运行从其主机环境中获取env,因此仅incron由非root用户执行应该需要任何类型的env或PATH fiddling

所以...... root的incrontab:

/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; sudo /path/to/my/script.sh $@/$#"
Run Code Online (Sandbox Code Playgroud)

没有骰子...尝试&&而不是;=没有骰子.如果你能想到上面的变化,我可能已经尝试过了......

所以,让我们试试一下restorecond -R /usr/sbin/incrond /etc/incron*!嗯,也没有变化. service incrond stop接着service incrond start然后service …

bash selinux inotify centos6

8
推荐指数
1
解决办法
9187
查看次数

docker-container中的inotifywait不会注册更改

我有一个在docker-container中运行的脚本,它通过侦听目录中的更改inotifywait.该目录通过安装到主机系统docker -v.

出于某种原因,当更改此目录中的文件时,不会触发inotifywait.

这是有问题的脚本行

inotifywait -e create -e modify -e delete -e move  /etc/nginx/sites-enabled
Run Code Online (Sandbox Code Playgroud)

容器就像这样启动(通过无花果)

web:
  build: .
  ports:
   - "80:80"
  volumes:
   - ./conf:/etc/nginx/sites-enabled
Run Code Online (Sandbox Code Playgroud)

当我启动设置时fig up,执行脚本,但安装的卷中的更改不会触发inotify-barrier.

inotify inotifywait docker boot2docker

8
推荐指数
1
解决办法
2783
查看次数

inotify事件IN_MODIFY为tftp put发生两次

我正在使用inotify来监听对文件的修改.

当我测试文件修改时,程序运行正常.

# echo "test" > /tftpboot/.TEST

Output:
Read 16 data
IN_MODIFY
Run Code Online (Sandbox Code Playgroud)

但是当我执行tftp put时,会生成两个事件:

tftp>  put .TEST
Sent 6 bytes in 0.1 seconds
tftp>

Output:
Read 16 data
IN_MODIFY
Read 16 data
IN_MODIFY
Run Code Online (Sandbox Code Playgroud)

知道如何避免重复通知吗?

代码如下:

#include <sys/inotify.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    int fd = inotify_init();
    if (fd < 0)
    {
        cout << "inotify_init failed\n";
        return 1;
    }
    int wd = inotify_add_watch(fd, "/tftpboot/.TEST", IN_MODIFY);
    if …
Run Code Online (Sandbox Code Playgroud)

c linux file inotify tftp

8
推荐指数
1
解决办法
2102
查看次数

自动检测文件更改并通过S3进行同步

我在Linux系统上有一个本地媒体文件目录,我使用s3sync脚本与Amazon S3帐户同步.目前,当我知道媒体文件已被修改时,我手动运行s3sync脚本.

修改文件后如何自动运行脚本?

我想创建一个cron作业来每隔几分钟运行一次脚本,但这似乎是一个过多的处理,因为即使没有更改,脚本仍然必须扫描整个目录结构,这是非常大的.

我还考虑了incron/inotify,它允许在特定文件或目录更改时运行命令,但这些工具似乎不会自动支持监视对整个嵌套目录的更改.如果我错了,请纠正我,但似乎incron/inotify只能监控他们明确告知要监控的文件.例如,如果我想监视目录内任何级别的所有文件的更改,我必须编写单独的脚本来监视目录和文件添加/删除,以更新incron监视的文件和目录列表.

有更有效的解决方案吗?

linux filesystems bash amazon-s3 inotify

7
推荐指数
1
解决办法
4858
查看次数

使用非阻塞 iNotify

我的目标:监视文本文件以进行修改,而监视器不会阻塞我的程序,而是形成循环的一部分(因此按顺序检查)。

我的脑袋说:要么找到一种方法以非阻塞模式运行 iNotify,要么线程 iNotfiy。

我尝试了非阻塞方式,并使用以下命令为我的 iNotify 实例禁用了 O_NONBLOCK:

fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做然后我尝试:

length = read(fd, buffer, BUF_LEN);
Run Code Online (Sandbox Code Playgroud)

它一直告诉我,对于读取,资源暂时不可用。

谁能给我一些关于如何实现我想做的事情的提示?不需要是这种方法,但我需要该功能,因为我正在使用网络服务器编辑文本文件并希望将修改读入我的 C++ 程序以更新变量。

提前致谢!

c++ file monitor inotify

7
推荐指数
1
解决办法
3903
查看次数

如何中断或去抖inotifywait循环?

我有一个小脚本,用于监视文件的变化inotifywait.当某些内容发生变化时,会通过一个过程(编译,压缩,重组等)发送一批文件,这些过程大约需要十秒钟才能运行.

请考虑以下示例:

touch oli-test
inotifywait -mq oli-test | while read EV; do sleep 5; echo "$EV"; done
Run Code Online (Sandbox Code Playgroud)

如果你touch oli-test在另一个终端上运行几次,你会看到每个循环在它继续前完成.这种情况对我来说非常真实.如果我忘记在文件处理过程中忘记保存文件,或者发现错误,那么事件就会叠加,我等待几分钟.

令我感到震惊的是,有两种技术可以使这个工作流程更加客观.我不确定什么是最简单或最好的,所以我提出了两个:

  1. 中断以前的运行,并立即重启.脚本化进程目前只是一组内联命令.我可以将它们分解为Bash函数,我并不是想要将它们打破得更远.

  2. 对等待处理的事物列表进行去抖动,以便如果一次发生五个事件(或者它已经处理过),它只会再次运行.

(或两者......因为我确定有两种情况都有用的情况)

我也对不同的方法持开放态度,inotifywait但他们需要给我相同的结果并在Ubuntu上工作.

bash interrupt inotify debouncing inotifywait

7
推荐指数
2
解决办法
1022
查看次数

使用 cabal + GHCID 进行文件监视快速 Haskell 重建+测试?

简而言之,我的问题是“如何在 cabal 管理的多库 haskell 项目存储库中获得快速保存重新测试工作流程?”

\n

我已经尝试了一些事情并做了一些研究。在了解更多详细信息之前,请先查看典型的项目存储库结构,然后将问题分解为更多详细信息:

\n

存储库开发结构

\n

我从事多个 Haskell 项目,这些项目通常具有以下形式:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo.cabal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 unit-test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bar.cabal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 unit-test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 baz\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 baz.cabal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 unit-test\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 stack.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cabal.project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 nix\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 ...\n
Run Code Online (Sandbox Code Playgroud)\n

cabal.project文件如下所示:

\n
packages: \n  foo\n  bar\n  baz\n  ...\ntests: True\nrun-tests: True\n
Run Code Online (Sandbox Code Playgroud)\n

堆栈文件包含基本相同的项目列表和 LTS ID,因此我可以只使用IOHK\'s haskell.nixstackProject中的 nix 函数来为自己提供一个包含 cabal 等的 nix shell。(这个问题更多的是关于阴谋集团的处理,所以我认为这里的这段文字只是一个背景说明,我认为与这个堆栈溢出问题无关。)

\n

这个设置允许我在项目中的任何地方运行cabal test all …

haskell unit-testing inotify cabal

7
推荐指数
2
解决办法
1492
查看次数