2008-09-26 22 views
4

Existe-t-il un moyen de forcer un processus Samba à fermer un fichier donné sans le détruire? Samba ouvre un processus pour chaque connexion client, et parfois je vois qu'il contient des fichiers ouverts beaucoup plus longtemps que nécessaire. Habituellement, je viens de tuer le processus, et le client (windows) le rouvrira la prochaine fois qu'il accèdera au partage; mais parfois, il lit activement un autre fichier pendant une longue période, et je voudrais juste "tuer" un fichier, et pas toute la connexion.Forcer un processus Samba à fermer un fichier

edit: J'ai essayé le 'net rpc file close', mais cela ne semble pas fonctionner. Quelqu'un sait pourquoi?

edit: this est la meilleure mention que j'ai trouvé de quelque chose de similaire. Il semble être un problème sur le client Win32, quelque chose que les serveurs Microsoft ont une solution de contournement; mais pas Samba. Je souhaite que la commande net rpc file close <fileid> a fonctionné, je vais continuer à essayer de trouver pourquoi. J'accepte la réponse de LuckyLindy, même si cela n'a pas résolu le problème, car c'est la seule procédure utile dans ce cas.

Répondre

5

Cela arrive tout le temps sur nos systèmes, en particulier lors de la connexion à Samba à partir d'une machine Win98. Nous suivons ces étapes pour le résoudre (qui sont probablement similaires à la vôtre):

  • Voir quel ordinateur en utilisant le fichier (par exemple lsof|grep -i <file_name>)
  • Essayez d'ouvrir ce fichier à partir de l'ordinateur incriminé, ou si un processus se cache dans le gestionnaire de tâches que nous pouvons fermer
  • Si pas de chance, a la sortie de l'utilisateur des programmes de réseau importants
  • Tuer le processus Samba de l'utilisateur de linux (ie kill -9 <pid>)

J'aimerais qu'il y ait un meilleur moyen!

+0

oui, c'est exactement ce que je fais. – Javier

+0

Cela nous arrive en utilisant Windows XP pour accéder à un serveur OS X Mavericks. 'grep's pour le processus smbd qui a le fichier ouvert sur le serveur et le tuer semble être la solution. – korylprince

0

S'il n'y a pas d'option explicite dans samba, il serait impossible de fermer de façon externe un descripteur de fichier ouvert avec des interfaces unix standard.

0

De manière générale, vous ne pouvez pas vous mêler des descripteurs de fichier de processus de l'extérieur. Pourtant, en tant que root, vous pouvez bien sûr le faire comme vous avez vu dans cet article phrack de 1997: http://www.phrack.org/issues.html?issue=51&id=5#article - Je ne recommanderais pas de le faire sur un système de production si ...

0

La meilleure question dans ce cas serait pourquoi? Pourquoi voulez-vous fermer un fichier plus tôt? À quoi cela sert-il finalement de fermer le dossier? Qu'essayez-vous d'accomplir?

+0

Il est très fréquent qu'un client Windows ouvre un fichier et semble l'avoir fermé; mais le processus samba le maintient ouvert et les autres utilisateurs ne peuvent pas l'effacer. la seule façon de le libérer est de tuer le processus. – Javier

+0

IOW, ce n'est pas "tôt" la fermeture du fichier. il devrait être déjà fermé il y a longtemps. – Javier

+0

Ma suggestion serait de déposer un rapport de bogue avec les développeurs samba. Ensuite, à partir de là, il n'y a pas de bonne façon de fermer un fichier depuis l'extérieur d'un processus sans mettre le processus dans un état instable. Vous pouvez toujours redémarrer Samba périodiquement comme un travail autour! –

2

Je crée une nouvelle réponse, puisque ma première réponse contenait juste plus de questions, et vraiment pas beaucoup d'aide. Après avoir fait un peu de recherche, je n'ai pas trouvé de bogues ouverts pour la dernière version de Samba, veuillez consulter le site Web the Samba Bug Report et créer un nouveau bogue. C'est le moyen le plus simple d'amener quelqu'un à proposer des idées sur la façon de le résoudre, et de demander aux développeurs de se pencher sur le problème.LuckyLindy a laissé un commentaire dans ma réponse précédente disant que c'est comme ça depuis 5 ans maintenant, le projet Open Source est la meilleure façon de réparer quelque chose qui ne va pas en le signalant, et/ou en fournissant des correctifs.

J'ai également trouvé une entrée de liste de diffusion: Samba Open files, ils suggèrent d'ajouter posix locking=no au fichier de configuration, tant que vous n'avez pas les fichiers distribués sur NFS ne pas verrouiller le fichier devrait être correct, c'est si le fichier est en cours de stockage est verrouillé.

Si vous le vouliez aussi, vous pourriez écrire un programme qui utilise ptrace et s'attacher au programme, et il passe à travers et déverrouille et ferme tous les fichiers. Cependant, sachez que cela peut laisser Samba dans un état inconnu, ce qui peut être plus dangereux.

Le travail que j'ai déjà mentionné est de redémarrer périodiquement samba comme un moyen de contourner. Je sais que ce n'est pas une solution mais cela pourrait fonctionner temporairement.

+0

le mailthread était intéressant; Malheureusement, il semble que le problème ne consiste pas à utiliser des verrous posix ou non, il s'agit de samba croyant que le fichier doit être ouvert, donc les autres clients Samba ne peuvent pas le supprimer. – Javier

0

Samba fournit des commandes pour visualiser les fichiers ouverts et les fermer.

Pour lister tous les fichiers ouverts:

rpc net -U ADadmin% mot de passe

Remplacer ADadmin et mot de passe avec les informations d'identification d'un domaine Windows AD admin. Cela vous donne un identifiant de fichier, le nom d'utilisateur de qui l'a ouvert, l'état de verrouillage et le nom de fichier. Vous voudrez souvent filtrer les résultats en les faisant passer par grep.

Une fois que vous avez trouvé un fichier que vous voulez fermer, copier son numéro d'identification de fichiers et d'utiliser cette commande:

rpc net proche fileid -U ADadmin% mot de passe

+0

Ceux-ci ressemblent à des commandes rpc vers un serveur Windows, authentifié par AD. Ma question concerne un serveur samba, et aucune AD nulle part. – Javier

+0

Ils travaillent aussi pour Samba. Voici la (documentation) [clairsemée] (https://www.samba.org/samba/docs/man/manpages/net.8.html). Dans votre cas, je ne suis pas sûr de ce que vous utiliseriez pour le compte administrateur. Tu pourrais essayer root? – oo12

0

J'avais besoin d'accomplir quelque chose comme ça, pour pouvoir facilement démonter des appareils que je partageais. J'ai écrit ce script bash rapide:

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

Il faut un seul argument, les chemins pour fermer:

smbclose /media/drive 

Tout chemin qui correspond à cet argument (par grep) est fermée, de sorte que vous devriez être assez spécifique avec elle. (Seuls les fichiers ouverts via samba sont affectés.) Évidemment, vous avez besoin de root pour fermer les fichiers ouverts par d'autres utilisateurs, mais cela fonctionne bien pour les fichiers ouverts. Notez que comme avec toute autre fermeture d'un fichier force, la corruption des données peut se produire. Tant que les fichiers sont inactifs, ça devrait aller.

C'est assez moche, mais pour mon cas d'utilisation (fermeture de points de montage entiers) ça marche assez bien.