我有一个与我一起观看的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脚本 - 我可以这样做)让它在启动脚本之前等待几分之一秒?
我一直在调整的例子在这里,使其反复观看了"修改"的文件.我的代码在这里.在我的测试中,inotify通知仅在文件第一次被"修改"(即touch'ed)时触发.对文件的任何后续修改都不会导致触发任何通知.stat显示"修改"时间已更改.此外,修改代码以删除手表并在每次通知触发时重新添加(即移动inotify_add_watch并inotify_rm_watch进入while(1)我的样本中的循环内)并没有帮助解决此问题.
我想知道这里有没有人可以帮助解决我可能做错的事情.此外,虽然我已经添加了一块手表IN_ALL_EVENTS,但我真的只关心IN_MODIFY事件.不确定这是否有所不同.
此外,这个用例不起作用吗?我应该改变观察目录的方法吗?请指教.
TIA.
编辑1:正如themel所述,处理i需要一些修复.但是,即使是固定版本也不会为后续文件系统"事件"触发通知.此外,在目录上添加监视而不是文件表现出类似的非确定性行为.
编辑2:我想根据这个工作答案得到这个asio + inotify示例.不幸的是,这个例子根本不适用于我.任何帮助将非常感激.TIA.
是否有一种方法(在Linux中)无需轮询即可获取文件锁定状态的更新?
我知道状态可以通过lockf(fd,F_TEST)或推测LOCK_NB | LOCK_SH进行轮询,但轮询不好(tm).
当然,找出文件未锁定的时间可以通过简单的锁定尝试来完成,但我也想对其他边缘进行采样(用例:一个(大)程序使用lockf在实例之间进行同步 - 我可能会得到它变成了flock,我想添加一个GUI,当锁可以获取时显示,当然不会占用锁定).
请注意,inotify在这种情况下不起作用,至少在linux 3.9.1上是这样.
我想测试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) 我正在尝试使用单个 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 何时完成,我只能通过测试硬编码的最大文件大小来猜测(非常讨厌的解决方案!)。
我有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)
还有什么不对吗?
问候
有人可以解释为什么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,如果这有什么改变的话。
我正在读取一组文件(日志文件)中的行,因为它们是使用 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) 我正在使用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?
我已经搜索了几个小时,似乎找不到该问题的最新答案
问题:显然 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)