在Linux中获取CIFS挂载的文件创建通知

17

我在Ubuntu服务器上通过CIFS挂载了一个Windows共享。 我需要一种方法来知道何时向Windows共享添加了新文件。 我尝试了这个inotify程序:

http://www.thegeekstuff.com/2010/04/inotify-c-program-example/

它可以与标准目录一起使用,但无法捕获任何CIFS更改。 我不一定需要使用inotify,虽然我想使用,但对于如何实现获取文件创建通知的任何建议都很好。

10个回答

20

我也在处理这个问题,遇到了同样的问题 - 经过在谷歌上的一些搜索后,不幸的是,在CIFS已挂载的分区上使用inotify是不可能的 - 几年前在红帽论坛上发布的以下内容:

"目前,使用CIFS是不可能实现这一点的。允许文件系统设置额外通知的VFS钩子最近已被删除。唯一的“用户”是CIFS,而且它从来没有正常工作过。内核接口也存在严重问题。

我认为 Steve 计划重新实现它,但这是一个主要项目,需要向内核的VFS层添加新功能."

虽然这已经是几年前的事情了,但看起来我们离拥有这个功能还有很长的路要走——真可惜,我也非常需要这个功能!


14

我也遇到了这个问题,和Stephen Sullivan (CIFS + inotify = no go)得出了相同的结论。

然而,由于我的工作流程恰好依赖于远程挂载和依赖于inotify的自动编译工具,所以我最终采取了一种(非常拼凑和hacky)的解决方案,基本上只是使用轮询来监视变化,然后再次触摸挂载的文件,这似乎会触发inotify事件。这不是我最光荣的时刻。

话虽如此,它确实有效,所以,尽情享用:http://github.com/rubyruy/watchntouch


4
旧话题,但仍然重要!我的回答是:“这取决于!”基于我目前的实证测试,行为非常清晰。如果Linux主机启动文件系统事件(在CIFS挂载时),那么inotify会完全看到它。如果托管CIFS挂载的Windows机器启动文件系统事件,则[in Linux机器上的] inotify将根本不会看到它。
如果你的目标是让Linux主机得到通知,以便知道Windows主机创建或写入文件,则你没有运气。由于这可能是此机制最期望的使用方式,因此这个微妙的“这取决于”答案并不是非常有用!

1

1

我想补充一下,最近使用Azure Container Instances与挂载在系统中的Azure Files时遇到了这个问题。由于使用了CIFSInotify也无法看到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"

我使用了一个多阶段的Dockerfile,然后将生成的软件包复制到目标容器中。我必须使用--allow-untrusted标志来进行安装。
apk add --allow-untrusted /tmp/fswatch-1.17.1-r0.apk
以下是Dockerfile的相关部分。

## ==========
## 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"

希望这些对于和我面临相同问题的人有所帮助!

0
可以做到...某种程度上
如果您在webdav服务器上设置并将共享作为webdav位置包含进来,您可以通过从Windows设备通过webdav访问它的同时监控您samba服务器上的位置。
这个方法的一个大问题是文件权限非常繁琐...跟apache2 webdav一样,因为缺少透传身份验证。

0
如果您将其反转,并从Linux主机提供CIFS共享,并且让网络客户端上传文件到此共享,则服务器上的inotify将能够检测到何时已上传新文件(通过CLOSE_WRITE事件)。

0

0

我已经处理了我的文档搜索引擎的主题,并且项目的以下部分已经开发。我提交了第一个草稿。不幸的是,我必须首先处理我的其他项目。找出“smbclient”命令。当我准备好时,您可以将此项目用作库,或者将其启动为系统挂钩应用程序,该应用程序将向其他应用程序提供信息。

https://github.com/stefanwerfling/smbeye/blob/main/src/inc/SmbClientNotif.ts

希望这可以为您提供一个解决办法。或者你可以等我准备好再开始。;)

0

我建议使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接