Pergunta

Existe uma maneira de forçar um processo de Samba para fechar um determinado arquivo sem matá-lo?

Samba abre um processo para cada conexão do cliente, e às vezes eu vejo que detém os arquivos abertos muito mais tempo do que o necessário. Normalmente eu apenas matar o processo, e o (Windows) cliente irá reabri-lo na próxima vez que acessar o compartilhamento; Mas às vezes é lendo ativamente outro arquivo por um longo tempo, e eu gostaria de simplesmente 'matar' um arquivo, e não toda a conexão.

edit: Eu tentei o 'net arquivo rpc close', mas não parece trabalho. Qualquer um sabe por quê?

edit: este é a melhor menção i 've encontrados em algo similar. Parece ser um problema no cliente win32, algo que os servidores da Microsoft tem uma solução para; mas Samba não. Desejo o comando net rpc file close <fileid> trabalhou, eu vou continuar a tentar descobrir o porquê. Estou aceitando a resposta de LuckyLindy, mesmo que isso não resolver o problema, porque é o procedimento só é útil neste caso.

Foi útil?

Solução

Isso acontece o tempo todo em nossos sistemas, especialmente ao se conectar ao Samba de uma máquina Win98. Nós siga estes passos para resolvê-lo (que são provavelmente semelhante à sua):

  • Veja qual o computador está usando o arquivo (ou seja lsof|grep -i <file_name>)
  • Tente abrir o arquivo do computador ofender, ou ver se um processo está escondendo no gerenciador de tarefas que podemos fechar
  • Se nenhuma sorte, tem a saída de usuário de todos os programas de rede importantes
  • processo Samba matança do utilizador a partir do Linux (isto é kill -9 <pid>)

Eu gostaria que houvesse uma maneira melhor!

Outras dicas

Estou criando uma nova resposta, desde a minha primeira resposta realmente apenas continha mais perguntas, e realmente não foi um monte de ajuda.

Depois de fazer um pouco de pesquisa, eu não tenho sido capaz de encontrar quaisquer bugs abertos atuais para a versão mais recente do Samba, confira o bug Report Samba website, e criar um novo bug. Esta é a maneira mais simples de conseguir alguém para sugerir idéias a respeito de como possivelmente corrigi-lo, e ter desenvolvedores olhar para a questão. LuckyLindy deixou um comentário na minha resposta anterior, dizendo que esta é a forma como tem sido durante 5 anos, bem o projeto é Open Source a melhor maneira de corrigir algo que está errado reportando-a, e ou fornecimento de patches.

Eu também encontrei um mailing entrada da lista: arquivos Samba Abertas , eles sugerem a adição de posix locking=no os arquivos de configuração, desde que você também não tem os arquivos entregues através de NFS não bloqueando o arquivo deve estar bem, isto é, se o arquivo está sendo realizada está bloqueado.

Se você queria também, você poderia escrever um programa que usa ptrace e anexa ao programa, e que atravessa e destrava e fecha todos os arquivos. Entretanto, esteja ciente que isso pode, eventualmente, deixar Samba em um estado desconhecido, que pode ser mais perigoso.

A em torno do trabalho que eu já mencionei é periodicamente reiniciar samba como um trabalho em torno. Eu sei que não é uma solução, mas pode funcionar temporariamente.

Este é provavelmente respondida aqui: Como fechar um descritor de arquivo de outro processo em sistemas unix

Em uma suposição, 'net rpc arquivo perto' provavelmente não funciona porque a comunicação entre dizendo Samba para fechar o arquivo acaba não sendo olhado até o arquivo que deseja perto é feito sendo lido.

Se não houver uma opção explícita no samba, que seria impossível externamente perto de um descritor de arquivo aberto com interfaces padrão do UNIX.

De um modo geral, você não pode se meter com um descritor de arquivo processo a partir do exterior. No entanto, como root você pode fazer de curso que, como você viu nesse artigo phrack de 1997: http://www.phrack.org/issues.html?issue=51&id=5#article - eu não recomendo fazer isso em um sistema de produção embora ...

A melhor pergunta, neste caso, seria por quê? Por que você quer para fechar um arquivo cedo? Que finalidade última análise, tem que fechar o arquivo? O que você está tentando realizar?

Samba fornece comandos para a visualização de arquivos abertos e fechá-los.

Para listar todos os arquivos abertos:

net -U arquivo rpc ADadmin % password

Substitua ADadmin e password com as credenciais de um administrador de domínio AD do Windows. Isso lhe dá uma ID de arquivo, nome de usuário que tem que abrir, status de bloqueio, e o nome do arquivo. Você frequentemente vai querer filtrar os resultados, canalizando-los através de grep.

Uma vez que você encontrou um arquivo que você deseja fechar, copiar seu número de ID de arquivo e usar este comando:

net arquivo rpc perto fileid -U ADadmin % password

I necessário para realizar algo como isso, para que eu pudesse dispositivos facilmente desmontar aconteceu de eu estar partilha. Eu escrevi este script bash rápida:

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

É preciso um único argumento, os caminhos para perto:

smbclose /media/drive

Qualquer caminho que partidas que o argumento (por grep) está fechado, então você deve ser muito específico com ele. (Apenas os arquivos abertos através de samba são afetados.) Obviamente, você precisa de raiz para fechar arquivos abertos por outros usuários, mas funciona bem para arquivos que você tem aberto. Note que como com qualquer outro fechamento força de um arquivo, corrupção de dados pode ocorrer. Enquanto os arquivos estão inativos, ele deve estar bem apesar de tudo.

É muito feio, mas para o meu caso de uso (fechando toda pontos de montagem) que funciona bem o suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top