Получение файла Создать уведомления для CIFS Mount в Linux

У меня есть общий ресурс Windows, смонтированный через CIFS на сервере Ubuntu. Мне нужен способ узнать, когда новый файл был добавлен в общий ресурс Windows. Я попробовал эту программу inotify:

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

Который отлично работает со стандартными каталогами, но не может отследить любые изменения CIFS. Мне не обязательно использовать inotify, хотя я хотел бы, но любые предложения о том, как добиться получения уведомлений о создании файла, были бы хорошими.

10 ответов

Я также работал над этим и столкнулся с той же проблемой - кажется (после небольшого траления на Google), что, к сожалению, невозможно использовать inotify на смонтированных разделах CIFS - следующее было в сообщении на форуме redhat от пару лет назад:

"В настоящее время это невозможно с помощью CIFS. Хуки VFS, позволяющие файловой системе настраивать дополнительные уведомления, были недавно удалены. Единственным" пользователем "из них был CIFS, и он все равно никогда не работал должным образом. серьезные проблемы тоже.

Я думаю, что у Стива есть планы переопределить его, но это крупный проект, который означает добавление новых функций в слой VFS ядра ".

Хотя это было пару лет назад, похоже, мы не приблизились к тому, чтобы это средство было доступно - позор, я действительно мог бы им воспользоваться!

Я тоже столкнулся с этим и пришел к тому же выводу, что и Стивен Салливан (CIFS + inotify = no go).

Однако, поскольку мой рабочий процесс зависел как от удаленных монтирований, так и от средств автоматической компиляции, использующих inotify, я закончил тем, что создал (довольно отчаянное и хакерское) решение, которое в основном просто использует опрос для отслеживания изменений, а затем снова обращается к тем же файлам. на смонтированной стороне, которая , кажется, запускает события inotify. Это не мой гордый момент.

Сказав это, он работает, так что наслаждайтесь: http://github.com/rubyruy/watchntouch

Старая тема, все еще важная! Отвечаю на это: "как много!". Судя по моим эмпирическим тестам на данный момент, поведение довольно ясно. Если хост Linux инициирует событие файловой системы [при монтировании CIFS], то inotify прекрасно его увидит. Если компьютер Windows, на котором размещено монтирование CIFS, инициирует событие файловой системы, то inotify [на машине Linux] его вообще не увидит.

Если ваша цель состоит в том, чтобы хост Linux получил уведомление о том, что хост Windows создал или записал в файл, то вам не повезло. Поскольку это, вероятно, наиболее желательное использование этого механизма, он делает этот тонкий ответ "в зависимости от обстоятельств" не очень полезным!

просто хотел добавить, что я также недавно столкнулся с этой проблемой при использовании экземпляров контейнеров Azure с файлами Azure, подключенными к системе. Inotify также не видит никаких изменений в монтировании файлов Azure , я думаю, поскольку он использует CIFS.

Я наткнулся на полезный инструмент, который также может использоватьpollingвместоinotify.

Это называется .

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"

Я использовал многоступенчатую обработку, а затем скопировал полученный пакет в целевой контейнер. я должен был использовать--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(пришлось использоватьbashshebang в системе на основе Debian...YMMV.)

      #!/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"

Надеюсь, что они полезны для кого-то в той же лодке!

У меня возникла такая проблема для моего проекта OCR, который отслеживает удаленный общий ресурс samba для подачи Tesseract (https://github.com/deajan/pmOCR)

Завершено использованием вставной замены inotifywait на основе каталогов опроса, см. https://github.com/javanile/inotifywait-polling

Действительно, есть решения для Python, такие как fsobserver, которые также позволяют использовать режим опроса.

Это может быть сделано.. вроде

Если вы настроили сервер webdav и включили общий ресурс в качестве местоположения webdav, вы можете отслеживать местоположение на вашем сервере samba, одновременно обращаясь к нему через webdav с вашего компьютера с Windows.

Большая проблема с этим состоит в том, что права доступа к файлам a b*tch... как обычно с apache2 webdav, так как отсутствует сквозная аутентификация

Если вы перевернете это, и общий ресурс CIFS будет обслуживаться с хоста Linux, а сетевой клиент будет загружать файлы в этот общий ресурс, тоinotifyна сервере сможет определить, когда был загружен новый файл (черезCLOSE_WRITEсобытие).

Для хостов Windows, на которых установлены док-контейнеры Linux, есть подробная статья о его проблеме с предоставленным решением, которое работает как "docker-windows-volume-watcher": http://blog.subjectify.us/miscellaneous/2017/04/24/docker-for-windows-watch-bindings.html

Похоже, что поддержка от CIFS inotify в Linux появится не скоро.

Я предлагаю использовать файлы изменены

Я только что протестировал его с подключенными дисками CIFS из Windows. Это работало как шарм почти без задержек или нагрузки на сервер. Кажется довольно надежным.

  • Установить:

файлы установки sudo apt-get изменены

  • Для мониторинга/триггера:

    папка с измененными файлами/

  • Вывод будет выглядеть следующим образом:

папка/тест1

  • Вы можете передать вывод:

    папка с измененными файлами
    /
    | при чтении -r имя файла; do filename="${filename##*/}" echo "Запуск $filename" >> /var/log/fileschanged.log# делайте что хотите с $filenamedone

Я уже рассматривал эту тему для своей поисковой системы документов. И развивалась следующая часть проекта. Я зафиксировал первый черновик. К сожалению, сначала мне нужно позаботиться о других проектах. Выловите команду «smbclient». Когда я буду готов, вы можете использовать этот проект как библиотеку или запустить его как системное приложение, которое будет передавать информацию другим приложениям.

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

Я надеюсь, что это может послужить вам обходным путем. Или подожди, пока я буду готов. ;)

Другие вопросы по тегам