Получение файла Создать уведомления для 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
(пришлось использоватьbash
shebang в системе на основе 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
Я надеюсь, что это может послужить вам обходным путем. Или подожди, пока я буду готов. ;)