Заставить процесс Samba закрыть файл - PullRequest
4 голосов
/ 27 сентября 2008

Есть ли способ заставить процесс Samba закрыть данный файл, не убивая его?

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

edit: я пробовал 'net rpc file close', но, похоже, не работает. Кто-нибудь знает почему?

edit: this - лучшее упоминание о чем-то похожем. Кажется, это проблема на клиенте win32, для которой у серверов Microsoft есть обходной путь; но самба нет. Я хотел бы, чтобы команда net rpc file close <fileid> работала, я буду пытаться выяснить, почему. Я принимаю ответ LuckyLindy, даже если он не решил проблему, потому что это единственная полезная процедура в этом случае.

Ответы [ 8 ]

5 голосов
/ 26 февраля 2009

Это постоянно происходит в наших системах, особенно при подключении к Samba с компьютера с Win98. Чтобы решить эту проблему, выполните следующие действия (которые, вероятно, похожи на ваши):

  • Посмотрите, какой компьютер использует файл (т.е. lsof|grep -i <file_name>)
  • Попробуйте открыть этот файл с компьютера-нарушителя или посмотрите, не скрывается ли процесс в диспетчере задач, который мы можем закрыть
  • Если не повезет, попросите пользователя выйти из любых важных сетевых программ
  • Убить пользовательский процесс Samba из linux (т.е. kill -9 <pid>)

Хотелось бы, чтобы был лучший способ!

2 голосов
/ 26 февраля 2009

Я создаю новый ответ, так как мой первый ответ действительно содержал больше вопросов и действительно не сильно помог.

После небольшого поиска я не смог найти какие-либо текущие открытые ошибки для последней версии Samba, пожалуйста, проверьте веб-сайт Samba Bug Report и создайте новую ошибку. Это самый простой способ заставить кого-то предложить идеи относительно того, как возможно исправить это, и заставить разработчиков взглянуть на проблему. LuckyLindy оставил комментарий в моем предыдущем ответе, в котором говорилось, что так было уже 5 лет, так что проект с открытым исходным кодом - лучший способ исправить что-то неправильное, сообщив об этом или предоставив исправления.

Я также нашел одну запись в списке рассылки: Samba Открытые файлы , они предлагают добавить posix locking=no в файл конфигурации, если у вас нет файлов, передаваемых через NFS, не блокирующих файл должен быть в порядке, то есть если файл удерживается заблокирован.

Если вы тоже хотите, вы можете написать программу, которая использует ptrace и присоединяется к ней, и она проходит, разблокирует и закрывает все файлы. Однако следует помнить, что это может привести к тому, что Samba окажется в неизвестном состоянии, что может быть более опасным.

Обход, о котором я уже упоминал, заключается в том, чтобы периодически перезапускать samba в качестве обходного пути. Я знаю, что это не решение, но оно может работать временно.

1 голос
/ 19 февраля 2009

Здесь, вероятно, ответили: Как закрыть дескриптор файла из другого процесса в системах Unix

По-видимому, «net rpc file close», вероятно, не работает, потому что межпроцессное взаимодействие, сообщающее Samba закрыть файл, не просматривается до тех пор, пока файл, который вы хотите закрыть, не будет прочитан.

0 голосов
/ 05 марта 2016

Мне нужно было сделать что-то подобное, чтобы я мог легко размонтировать устройства, которыми я случайно поделился. Я написал этот скрипт быстрого bash:

#!/bin/bash
PIDS_TO_CLOSE=$(smbstatus -L | tail -n-3 | grep "$1" | cut -d' ' -f1 - | sort -u | sed '/^$/$
for PID in $PIDS_TO_CLOSE; do
    kill $PID
done

Требуется один аргумент, пути для закрытия:

smbclose /media/drive

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

Это довольно уродливо, но для моего варианта использования (закрытие целых точек монтирования) это работает достаточно хорошо.

0 голосов
/ 28 мая 2015

Samba предоставляет команды для просмотра открытых файлов и их закрытия.

Для просмотра всех открытых файлов:

net rpc file -U ADadmin % пароль

Замените ADadmin и пароль на учетные данные администратора домена Windows AD. Это дает вам идентификатор файла, имя пользователя, у которого он открыт, статус блокировки и имя файла. Вы часто будете хотеть фильтровать результаты, пропуская их через grep.

Как только вы нашли файл, который хотите закрыть, скопируйте его идентификатор файла и используйте эту команду:

net rpc file close fileid -U ADadmin % пароль

0 голосов
/ 23 февраля 2009

Лучший вопрос в этом случае будет почему? Почему вы хотите закрыть файл раньше? Какова цель в конечном счете, чтобы закрыть файл? Что вы пытаетесь достичь?

0 голосов
/ 23 февраля 2009

Вообще говоря, вы не можете вмешиваться в дескрипторы файлов процесса извне. Тем не менее, как пользователь root, вы, конечно, можете сделать это, как вы видели в той статье phrack за 1997 год: http://www.phrack.org/issues.html?issue=51&id=5#article - хотя я бы не рекомендовал делать это в производственной системе ...

0 голосов
/ 27 сентября 2008

Если в samba нет явной опции, было бы невозможно внешне закрыть дескриптор открытого файла стандартными интерфейсами Unix.

...