标签: inotify

使inotifywait将多个文件更新组合成一个?

我有一个与我一起观看的Sphinx文档的文件夹inotifywait(来自inotify-tools).该脚本重新构建html&singlehtml并刷新Chrome.

#!/bin/sh
inotifywait -mr source --exclude _build -e close_write -e create -e delete -e move | while read file event; do
    make html singlehtml
    xdotool search --name Chromium key --window %@ F5
done
Run Code Online (Sandbox Code Playgroud)

保存单个文件时,此工作正常.但是,当我hg update使用旧版本或粘贴文件source夹中的多个文件时,它会为每个文件触发脚本.

是否有一个简单的解决方法(没有编写自定义python脚本 - 我可以这样做)让它在启动脚本之前等待几分之一秒?

shell inotify inotify-tools

6
推荐指数
1
解决办法
3870
查看次数

inotify不会在文件修改时触发通知

我一直在调整的例子在这里,使其反复观看了"修改"的文件.我的代码在这里.在我的测试中,inotify通知仅在文件第一次被"修改"(即touch'ed)时触发.对文件的任何后续修改都不会导致触发任何通知.stat显示"修改"时间已更改.此外,修改代码以删除手表并在每次通知触发时重新添加(即移动inotify_add_watchinotify_rm_watch进入while(1)我的样本中的循环内)并没有帮助解决此问题.

我想知道这里有没有人可以帮助解决我可能做错的事情.此外,虽然我已经添加了一块手表IN_ALL_EVENTS,但我真的只关心IN_MODIFY事件.不确定这是否有所不同.

此外,这个用例不起作用吗?我应该改变观察目录的方法吗?请指教.

TIA.

编辑1:正如themel所述,处理i需要一些修复.但是,即使是固定版本也不会为后续文件系统"事件"触发通知.此外,在目录上添加监视而不是文件表现出类似的非确定性行为.

编辑2:我想根据这个工作答案得到这个asio + inotify示例.不幸的是,这个例子根本不适用于我.任何帮助将非常感激.TIA.

c++ linux filesystems inotify

6
推荐指数
1
解决办法
4745
查看次数

在没有轮询的情况下收到关于flock/lockf/fcntl的通知更改

是否有一种方法(在Linux中)无需轮询即可获取文件锁定状态的更新?

我知道状态可以通过lockf(fd,F_TEST)或推测LOCK_NB | LOCK_SH进行轮询,但轮询不好(tm).

当然,找出文件未锁定的时间可以通过简单的锁定尝试来完成,但我也想对其他边缘进行采样(用例:一个(大)程序使用lockf在实例之间进行同步 - 我可能会得到它变成了flock,我想添加一个GUI,当锁可以获取时显示,当然不会占用锁定).

请注意,inotify在这种情况下不起作用,至少在linux 3.9.1上是这样.

linux notifications inotify flock fcntl

6
推荐指数
0
解决办法
378
查看次数

inotify api 在报告一两次后停止工作

我想测试inotify,所以从互联网上拿了几个例子,对其进行修改以学习各个方面,但失败了,因为它没有像我想要的那样工作。首先,我尝试查看一个运行良好的目录。

因此,我对文件的示例进行了一些修改,但它只能工作一次,并且在读取功能时被阻止

#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>

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

int main()
{
    int fd;
    fd = inotify_init();
    if (fd < 0)
        perror("inotify_init()");
        int wd;
        wd = inotify_add_watch(fd, "target", IN_CLOSE_WRITE);
    if (wd < 0)
        perror("inotify_add_watch");

    char buf[BUF_LEN];
    int len;

    while(1) {

         len = read(fd, buf, BUF_LEN);

         printf("after read\n");

        if (len > 0)
        {
            int i = 0;
            while (i < len)
            {
                struct inotify_event *event;
                event = (struct inotify_event *) …
Run Code Online (Sandbox Code Playgroud)

c select file-descriptor inotify

6
推荐指数
1
解决办法
1693
查看次数

是否可以在每次 ffmpeg 完成处理多个输出之一时收到通知?

我正在尝试使用单个 ffmpeg 命令来编码流 url 并生成许多输出文件。在此示例中,ffmpeg 将输出持续时间分别为 5、10 和 15 秒的三个文件:

ffmpeg -i <url> \
 -t  5 output_5.wav \
 -t 10 output_10.wav \
 -t 15 output_15.wav \
Run Code Online (Sandbox Code Playgroud)

该命令按预期工作,但我需要知道每个输出文件何时可用,以便尽快开始进一步处理。

有没有什么方法可以通知“文件output_XX.wav 已准备好”的每个事件?

我尝试过的一种方法是使用 inotifywatch 监听 CLOSE 事件,但我发现 ffmpeg 仅在最后一个文件结束时关闭文件。

我还可以监听 MODIFY 事件,但无法知道 ffmpeg 何时完成,我只能通过测试硬编码的最大文件大小来猜测(非常讨厌的解决方案!)。

streaming ffmpeg inotify

6
推荐指数
0
解决办法
462
查看次数

在将docx转换为PDF时,inotifywait触发事件两次

我有shell脚本与inotifwait设置如下:

inotifywait -r  -e close_write,moved_to  -m "<path>/upload" --format '%f##@@##%e##@@##%w'
Run Code Online (Sandbox Code Playgroud)

有一些docx文件驻留在监视目录中,一些脚本通过以下命令将docx转换为PDF:

soffice --headless --convert-to pdf:writer_pdf_Export <path>/upload/somedoc.docx --outdir  <path>/upload/
Run Code Online (Sandbox Code Playgroud)

一旦生成PDF,就会以某种方式触发事件两次.参赛作品如下:

somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/
somedoc.pdf##@@##CLOSE_WRITE,CLOSE##@@##<path>/upload/
Run Code Online (Sandbox Code Playgroud)

还有什么不对吗?

问候

shell inotify inotifywait

6
推荐指数
1
解决办法
383
查看次数

如何只监听inotifywait中的特定事件?

有人可以解释为什么inotifywait当我排除打开时仍然报告有关打开的文件吗?

mkdir /tmp/a

inotifywait --exclude acess,attrib,close_write,close_nowrite,close,open,moved_to,moved_from,move,delete,delete_self,unmount -r -m /tmp/a/

touch /tmp/a/test
/tmp/a/ OPEN test
/tmp/a/ CLOSE_NOWRITE,CLOSE test
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是是否创建了新文件或修改了当前文件。

我使用 CentOS 7,如果这有什么改变的话。

linux bash centos inotify inotifywait

6
推荐指数
1
解决办法
2761
查看次数

如何检测文件在读取时是否被截断

我正在读取一组文件(日志文件)中的行,因为它们是使用 pyinotify 编写的。

我正在使用 python 本机方法打开并读取文件:

file = open(self.file_path, 'r')
# ... later
line = file.readline()
Run Code Online (Sandbox Code Playgroud)

这通常是稳定的,可以处理被删除和重新创建的文件。pyinotify 将通知取消链接和后续链接。

但是,某些日志文件不会被删除。相反,它们被截断并将新内容写入同一文件的开头。

我无法可靠地检测何时发生这种情况,因为 pyinotify 仅报告写入。我目前得到的唯一证据是 pyinotify 报告写入并readline()返回一个空字符串。但是,后续的两次写入可能会触发相同的行为。

我曾考虑过比较文件的大小,file.tell()但根据文档tell会产生一个不透明的数字,并且似乎不能相信这是一个字节数。

有没有一种简单的方法来检测文件在读取时是否被截断?


编辑:

可以使用简单的 shell 命令来模拟截断文件:

echo hello > test.log
echo hello >> test.log
# Truncate test.log
echo goodbye > test.log
Run Code Online (Sandbox Code Playgroud)

为了补充这一点,可以使用一个简单的 python 脚本来确认file.tell()文件被截断时不会减少:

foo = open('./test.log', 'r')
line = foo.readline()
while line != '':
    print(foo.tell())
    print(line)
    line = foo.readline()

# Put a breakpoint on the following line …
Run Code Online (Sandbox Code Playgroud)

python linux file-monitoring inotify

6
推荐指数
1
解决办法
2310
查看次数

如何更改 Kubernetes 中的文件系统观察程序限制 (fs.inotify.max_user_watches)

我正在使用pm2来查看保存我的应用程序服务器的 NodeJS 程序源代码的目录,该程序在 Kubernetes 集群中运行。

但是,我收到此错误:

ENOSPC: System limit for number of file watchers reached
Run Code Online (Sandbox Code Playgroud)

我搜索了该错误,找到了这个答案:/sf/answers/3903443491/

# insert the new value into the system config
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Run Code Online (Sandbox Code Playgroud)

但是,我尝试在目标 k8s 节点上的 pod 中运行它,它说sudo找不到该命令。如果我删除sudo,我会收到此错误:

sysctl: setting key "fs.inotify.max_user_watches": Read-only file system
Run Code Online (Sandbox Code Playgroud)

如何将文件系统观察程序限制从 Kubernetes 节点上的 8192 修改为更高的值,例如 524288?

linux inotify kubernetes

6
推荐指数
1
解决办法
7316
查看次数

docker 安装卷上的 inotify (Mac / Linux)

我已经搜索了几个小时,似乎找不到该问题的最新答案

问题:显然 VirtualBox 正在 MacOS 上由 Docker 使用,并且它不希望将文件通知从主机操作系统传递到容器。因此,当从容器内执行这些操作时,inotifywait 只会通知监视文件夹上的文件活动。当这些操作是从主机执行时则不会。

Dockerfile

FROM python:3.9.6
COPY main.sh /bin/main.sh
RUN chmod +x /bin/main.sh
RUN apt-get update -y
RUN apt-get install -y inotify-tools
CMD /bin/main.sh
Run Code Online (Sandbox Code Playgroud)

主目录

#!/usr/bin/env bash

inotifywait -mq -r -e create -e modify -e delete -e move /data |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'" >> log.txt
    done
Run Code Online (Sandbox Code Playgroud)

构建容器

docker build -f Dockerfile -t my_container .
Run Code Online (Sandbox Code Playgroud)

运行容器

docker run -it -v …
Run Code Online (Sandbox Code Playgroud)

inotify inotifywait docker docker-for-mac

6
推荐指数
1
解决办法
5594
查看次数