我正在寻找有关如何找出哪个用户修改了特定文件的指导.虽然inotify非常适合在触摸特定文件时获取通知,但我如何确定哪个用户修改了该文件?我可以想到使用lsof,但我担心它可能不像我想要的那样"实时"和/或它可能对资源征税太多.实时,我的意思是,如果用户只是touch在文件上执行命令,那么当我lsof在文件上运行时,它可能无法被提取lsof.
是否有针对Linux kernel-3.0(或更高版本)的解决方案,允许用户获取类似于inotify描述已更改的特定文件段的通知?
有fschange针对kernel-2.6.21的补丁.有没有最新的解决方案?最近是否fanotify能够提供功能?
我试图在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) 我已经从EPEL存储库安装了incron(在你问之前;是的,我也尝试下载源代码并在本地编译;相同的结果)并且我试图在我的CentOS 6.4(最终)虚拟盒子上设置一个我成功制作原型的过程在我当地的Ubunto 12.04机器上:
预先提供的一些信息:
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 …
我有一个在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来监听对文件的修改.
当我测试文件修改时,程序运行正常.
# 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) 我在Linux系统上有一个本地媒体文件目录,我使用s3sync脚本与Amazon S3帐户同步.目前,当我知道媒体文件已被修改时,我手动运行s3sync脚本.
修改文件后如何自动运行脚本?
我想创建一个cron作业来每隔几分钟运行一次脚本,但这似乎是一个过多的处理,因为即使没有更改,脚本仍然必须扫描整个目录结构,这是非常大的.
我还考虑了incron/inotify,它允许在特定文件或目录更改时运行命令,但这些工具似乎不会自动支持监视对整个嵌套目录的更改.如果我错了,请纠正我,但似乎incron/inotify只能监控他们明确告知要监控的文件.例如,如果我想监视目录内任何级别的所有文件的更改,我必须编写单独的脚本来监视目录和文件添加/删除,以更新incron监视的文件和目录列表.
有更有效的解决方案吗?
我的目标:监视文本文件以进行修改,而监视器不会阻塞我的程序,而是形成循环的一部分(因此按顺序检查)。
我的脑袋说:要么找到一种方法以非阻塞模式运行 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++ 程序以更新变量。
提前致谢!
我有一个小脚本,用于监视文件的变化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在另一个终端上运行几次,你会看到每个循环在它继续前完成.这种情况对我来说非常真实.如果我忘记在文件处理过程中忘记保存文件,或者发现错误,那么事件就会叠加,我等待几分钟.
令我感到震惊的是,有两种技术可以使这个工作流程更加客观.我不确定什么是最简单或最好的,所以我提出了两个:
中断以前的运行,并立即重启.脚本化进程目前只是一组内联命令.我可以将它们分解为Bash函数,我并不是想要将它们打破得更远.
对等待处理的事物列表进行去抖动,以便如果一次发生五个事件(或者它已经处理过),它只会再次运行.
(或两者......因为我确定有两种情况都有用的情况)
我也对不同的方法持开放态度,inotifywait但他们需要给我相同的结果并在Ubuntu上工作.
简而言之,我的问题是“如何在 cabal 管理的多库 haskell 项目存储库中获得快速保存重新测试工作流程?”
\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 ...\nRun Code Online (Sandbox Code Playgroud)\n该cabal.project文件如下所示:
packages: \n foo\n bar\n baz\n ...\ntests: True\nrun-tests: True\nRun Code Online (Sandbox Code Playgroud)\n堆栈文件包含基本相同的项目列表和 LTS ID,因此我可以只使用IOHK\'s haskell.nixstackProject中的 nix 函数来为自己提供一个包含 cabal 等的 nix shell。(这个问题更多的是关于阴谋集团的处理,所以我认为这里的这段文字只是一个背景说明,我认为与这个堆栈溢出问题无关。)
这个设置允许我在项目中的任何地方运行cabal test all …
inotify ×10
linux ×4
bash ×3
c ×2
file ×2
filesystems ×2
inotifywait ×2
amazon-s3 ×1
boot2docker ×1
c++ ×1
cabal ×1
centos6 ×1
debouncing ×1
docker ×1
filestream ×1
haskell ×1
interrupt ×1
large-files ×1
monitor ×1
selinux ×1
tftp ×1
unit-testing ×1