我在Ubuntu服务器上通过CIFS挂载了一个Windows共享。 我需要一种方法来知道何时向Windows共享添加了新文件。 我尝试了这个inotify程序:
http://www.thegeekstuff.com/2010/04/inotify-c-program-example/
它可以与标准目录一起使用,但无法捕获任何CIFS更改。 我不一定需要使用inotify,虽然我想使用,但对于如何实现获取文件创建通知的任何建议都很好。
我在Ubuntu服务器上通过CIFS挂载了一个Windows共享。 我需要一种方法来知道何时向Windows共享添加了新文件。 我尝试了这个inotify程序:
http://www.thegeekstuff.com/2010/04/inotify-c-program-example/
它可以与标准目录一起使用,但无法捕获任何CIFS更改。 我不一定需要使用inotify,虽然我想使用,但对于如何实现获取文件创建通知的任何建议都很好。
我也在处理这个问题,遇到了同样的问题 - 经过在谷歌上的一些搜索后,不幸的是,在CIFS已挂载的分区上使用inotify是不可能的 - 几年前在红帽论坛上发布的以下内容:
"目前,使用CIFS是不可能实现这一点的。允许文件系统设置额外通知的VFS钩子最近已被删除。唯一的“用户”是CIFS,而且它从来没有正常工作过。内核接口也存在严重问题。
我认为 Steve 计划重新实现它,但这是一个主要项目,需要向内核的VFS层添加新功能."
虽然这已经是几年前的事情了,但看起来我们离拥有这个功能还有很长的路要走——真可惜,我也非常需要这个功能!
我也遇到了这个问题,和Stephen Sullivan (CIFS + inotify = no go)得出了相同的结论。
然而,由于我的工作流程恰好依赖于远程挂载和依赖于inotify的自动编译工具,所以我最终采取了一种(非常拼凑和hacky)的解决方案,基本上只是使用轮询来监视变化,然后再次触摸挂载的文件,这似乎会触发inotify事件。这不是我最光荣的时刻。
话虽如此,它确实有效,所以,尽情享用:http://github.com/rubyruy/watchntouch
我想补充一下,最近使用Azure Container Instances与挂载在系统中的Azure Files时遇到了这个问题。由于使用了CIFS,Inotify也无法看到Azure Files中的任何更改。
我偶然发现了一个有用的工具,它也可以使用轮询而不是使用Inotify。
它叫做fswatch
。
https://emcrisostomo.github.io/fswatch/
对于所涉及的基于Alpine的容器,我不得不创建自己的软件包,但是使用Alpine网站上的说明并不太困难。
https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package
如果有人觉得有帮助,这是我的APKBUILD
(无耻地基于Alpine提供的示例 :))
# Contributor:
# Maintainer:
pkgname=fswatch
pkgver=1.17.1
pkgrel=0
pkgdesc="A cross-platform file change monitor with multiple backends"
url="https://emcrisostomo.github.io/fswatch/"
arch="all"
license="GPL"
depends=""
depends_dev="alpine-sdk"
makedepends="$depends_dev"
install=""
subpackages="$pkgname-doc"
source="https://github.com/emcrisostomo/$pkgname/releases/download/$pkgver/$pkgname-$pkgver.tar.gz"
builddir="$srcdir/$pkgname-$pkgver"
prepare() {
default_prepare
# this function can be omitted if no extra steps are needed
}
build() {
./configure --prefix=/usr \
--sysconfdir=/etc \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--localstatedir=/var \
--disable-wxwidgets \
--disable-qt
make
}
check() {
make check
}
package() {
make DESTDIR="$pkgdir" install
}
sha512sums="c38e341c567f5f16bfa64b72fc48bba5e93873d8572522e670e6f320bbc2122f fswatch-1.17.1.tar.gz"
## ==========
## FSWatcher Builder
# IMPORTANT: Build this package on the same Alpine version used by the target container
FROM ${ALPINE_CONTAINER}:${ALPINE_VERSION} AS fswatch
COPY /scripts/fswatch.apkbuild /tmp/APKBUILD
USER root
WORKDIR /app
RUN apk upgrade --update-cache --available && apk add alpine-sdk sudo && rm -rf /var/cache/apk/*; \
adduser -D -h /home/build build; \
addgroup build abuild; \
mkdir -p /var/cache/distfiles; \
chmod a+w /var/cache/distfiles; \
chgrp abuild /var/cache/distfiles; \
chmod g+w /var/cache/distfiles; \
abuild-keygen -a -i -n
USER build
WORKDIR /home/build
RUN abuild-keygen -a -n; \
mkdir fswatch; \
cd fswatch; \
cp /tmp/APKBUILD ./; \
dos2unix ./APKBUILD; \
abuild checksum; \
abuild -r
更新:这里也提供我的 entrypoint.sh
,其中我运行了 fswatch
(在基于debian的系统上,我必须使用一个 bash
shebang...可能会有所不同)。
#!/bin/sh
set -e
{ /usr/bin/fswatch -0 -o -r -m poll_monitor /etc/nginx/ssl | while read -d "" event;do echo "$(date -Ins) Event Fired: ${event}";/opt/reload.sh;done; } &
exec "$@"
以及reload.sh
脚本:
#!/bin/sh
set -e
/usr/sbin/nginx -s reload && echo "nginx reloaded"
我已经处理了我的文档搜索引擎的主题,并且项目的以下部分已经开发。我提交了第一个草稿。不幸的是,我必须首先处理我的其他项目。找出“smbclient”命令。当我准备好时,您可以将此项目用作库,或者将其启动为系统挂钩应用程序,该应用程序将向其他应用程序提供信息。
https://github.com/stefanwerfling/smbeye/blob/main/src/inc/SmbClientNotif.ts
希望这可以为您提供一个解决办法。或者你可以等我准备好再开始。;)我建议使用fileschanged
我刚刚测试了一下,使用来自Windows的安装CIFS驱动器。几乎没有延迟或服务器负载问题,工作得很好,看起来非常可靠。
sudo apt-get install fileschanged
监视/触发:
fileschanged folder/
输出如下所示:
folder/test1
您可以将输出连接到管道中:
fileschanged
folder/
|
while read -r filename; do
filename="${filename##*/}"
echo "Triggering $filename" >> /var/log/fileschanged.log
# do whatever you like with $filename
done