Forcer un processus de Samba à fermer un fichier
Est-il un moyen de forcer une Samba processus de fermer un fichier sans le tuer?
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 tue le processus, et le client (windows) va le rouvrir la prochaine fois qu'il accède au partage; mais parfois, il lit activement d'autres fichiers pendant une longue période, et j'aimerais juste "tuer" un fichier, et pas toute la connexion.
edit: j'ai essayé le net rpc fichier à proximité, mais ne semble pas fonctionner. Quelqu'un sait pourquoi?
edit: ce est la meilleure mention, j'ai trouvé quelque chose de similaire. Il semble que ce soit un problème sur le client win32, quelque chose que les serveurs microsoft ont une solution de contournement pour; mais Samba ne le fait pas. Si la commande net rpc file close <fileid>
marchait, j'essaierai de savoir pourquoi. J'accepte la réponse de LuckyLindy, même si ça n'a pas résolu le problème, parce que c'est la seule procédure utile dans ce cas.
8 réponses
cela se produit 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 aux vôtres):
- voir quel ordinateur utilise le fichier (i.e.
lsof|grep -i <file_name>
) - essayer d'ouvrir ce fichier à partir de l'ordinateur incriminé, ou voir si un processus se cache dans le Gestionnaire des tâches que nous pouvons fermer
- si aucune chance, avoir l'utilisateur important réseau de programmes
- tuer le processus de Samba de l'utilisateur de linux (i.e.
kill -9 <pid>
)
j'aimerais qu'il y ait un meilleur moyen!
je crée une nouvelle réponse, puisque ma première réponse contenait vraiment plus de questions, et n'a vraiment pas été d'une grande aide.
après un peu de recherche, je n'ai pas pu trouver de bogues ouverts pour la dernière version de Samba, s'il vous plaît consultez le rapport de bogues de Samba site web, et créez un nouveau bogue. C'est la façon la plus simple d'obtenir quelqu'un pour suggérer des idées sur la façon de corriger éventuellement, et de faire regarder les développeurs question. LuckyLindy a laissé un commentaire dans ma réponse précédente disant que c'est la façon dont il a été pendant 5 ans maintenant, bien le projet est Open Source la meilleure façon de corriger quelque chose qui est faux en le rapportant, et ou en fournissant des correctifs.
j'ai aussi trouvé une entrée de liste de diffusion: Samba ouvrir les fichiers , ils suggèrent d'ajouter posix locking=no
au fichier de configuration, tant que vous n'avez pas aussi les fichiers distribués sur NFS ne verrouillant pas le fichier devrait être d'accord, c'est si le fichier est tenu est verrouillé.
si vous le voulez aussi, vous pouvez écrire un programme qui utilise ptrace et s'attache au programme, et il passe et déverrouille et ferme tous les fichiers. Cependant, sachez que cela pourrait éventuellement laisser Samba dans un état Inconnu, ce qui peut être plus dangereux.
le travail autour que j'ai déjà mentionné est de redémarrer périodiquement samba comme un travail autour. Je sais que ce n'est pas une solution, mais il pourrait travailler temporairement.
ceci est probablement répondu ici: comment fermer un descripteur de fichier d'un autre processus dans les systèmes unix
à une supposition, "net rpc file close" ne fonctionne probablement pas parce que la communication interprocess disant à Samba de fermer le fichier finit par ne pas être regardé jusqu'à ce que le fichier que vous voulez fermer soit lu.
s'il n'y a pas d'option explicite dans samba, cela serait impossible de fermer extérieurement un descripteur de fichier ouvert avec des interfaces unix standard.
en général, vous ne pouvez pas vous mêler des descripteurs de fichiers de processus de l'extérieur. Mais en tant que root vous pouvez bien sûr faire cela comme vous l'avez vu dans cet article de phrack de 1997: http://www.phrack.org/issues.html?issue=51&id=5#article - Je ne recommande pas de faire cela sur un système de production cependant...
la meilleure question dans ce cas serait pourquoi? Pourquoi voulez-vous fermer un fichier tôt? Dans quel but doit-il finalement fermer le fichier? Qu'essayez-vous d'accomplir?
Samba fournit des commandes pour visualiser les fichiers ouverts et les fermer.
pour lister tous les fichiers ouverts:
net rpc fichier -U ADadmin % mot de passe
remplacer ADadmin et password par les justificatifs D'identité D'un admin de domaine Windows AD. Cela vous donne un id de fichier, le nom d'utilisateur de celui qui l'a ouvert, le statut de verrouillage, et le nom de fichier. Vous aurez souvent vous voulez filtrer les résultats en les pipant à travers grep.
une fois que vous avez trouvé un fichier que vous voulez fermer, copiez son numéro d'identification de fichier et utilisez cette commande:
net rpc fichier fermer fileid -U ADadmin % mot de passe
j'avais besoin d'accomplir quelque chose comme ça, pour que je puisse facilement démonter les appareils que je partageais. J'ai écrit ce script de bash rapide:
#!/bin/bash
PIDS_TO_CLOSE=$(smbstatus -L | tail -n-3 | grep "" | cut -d' ' -f1 - | sort -u | sed '/^$/$
for PID in $PIDS_TO_CLOSE; do
kill $PID
done
Il prend un seul argument, les chemins de proximité:
smbclose /media/drive
N'importe quel chemin qui correspond à cet argument (par grep) est fermé, donc vous devriez être assez spécifique avec cela. (Seuls les fichiers ouverts via samba sont concernés.) Évidemment, vous avez besoin de root pour fermer les fichiers ouverts par d'autres utilisateurs, mais il fonctionne très bien pour les fichiers que vous avez ouverts. Notez que comme pour toute autre fermeture forcée d'un fichier, la corruption de données peut se produire. Tant que les fichiers sont inactifs, il devrait être bon.
c'est assez laid, mais pour mon étui (fermeture de points de montage entiers) ça marche assez bien.