Domanda

C'è un modo per forzare un processo Samba a chiudere un determinato file senza ucciderlo?

Samba apre un processo per ogni connessione client e a volte vedo che contiene file aperti molto più a lungo del necessario. Di solito uccido semplicemente il processo e il client (windows) lo riapre la prossima volta che accede alla condivisione; ma a volte sta attivamente leggendo altri file per molto tempo e mi piacerebbe semplicemente "uccidere" un file e non l'intera connessione.

modifica: ho provato a chiudere il file net rpc, ma non sembra funzionare. Qualcuno sa perché?

modifica: questo è la migliore menzione ho trovato qualcosa di simile. Sembra essere un problema sul client Win32, qualcosa per cui i server Microsoft hanno una soluzione alternativa; ma Samba no. Vorrei che il comando net rpc file close <fileid> funzionasse, continuerò a cercare di scoprire perché. Accetto la risposta di LuckyLindy, anche se non ha risolto il problema, perché in questo caso è l'unica procedura utile.

È stato utile?

Soluzione

Questo accade continuamente sui nostri sistemi, in particolare quando ci si collega a Samba da una macchina Win98. Seguiamo questi passaggi per risolverlo (che sono probabilmente simili ai tuoi):

  • Scopri quale computer sta utilizzando il file (ovvero lsof|grep -i <file_name>)
  • Prova ad aprire quel file dal computer incriminato o vedi se un task si nasconde in Task Manager che possiamo chiudere
  • Se non hai fortuna, chiedi all'utente di uscire da tutti i programmi di rete importanti
  • Termina il processo Samba dell'utente da Linux (ovvero kill -9 <pid>)

Vorrei che ci fosse un modo migliore!

Altri suggerimenti

Sto creando una nuova risposta, dato che la mia prima risposta conteneva solo più domande e in realtà non è stato di grande aiuto.

Dopo aver fatto un po 'di ricerca, non sono stato in grado di trovare alcun bug aperto corrente per l'ultima versione di Samba, controlla il sito Web Samba Bug Report e crea un nuovo bug. Questo è il modo più semplice per indurre qualcuno a suggerire idee su come eventualmente risolverlo e fare in modo che gli sviluppatori esaminino il problema. LuckyLindy ha lasciato un commento nella mia precedente risposta affermando che questo è il modo in cui è stato per 5 anni, bene, il progetto è Open Source il modo migliore per correggere qualcosa che non va segnalandolo e fornendo patch.

Ho anche trovato una voce della mailing list: Samba Apri file , suggeriscono di aggiungere posix locking=no al file di configurazione, purché non si disponga anche dei file distribuiti su NFS che non bloccano il file, va bene, cioè se il file che si tiene è bloccato.

Se anche tu lo volessi, potresti scrivere un programma che usa ptrace e si attacca al programma, che passa attraverso, sblocca e chiude tutti i file. Tuttavia, tieni presente che ciò potrebbe lasciare Samba in uno stato sconosciuto, che può essere più pericoloso.

Il lavoro intorno a cui ho già accennato è di riavviare periodicamente samba come soluzione. So che non è una soluzione ma potrebbe funzionare temporaneamente.

Questa è probabilmente una risposta qui: Come chiudere un descrittore di file da un altro processo nei sistemi unix

Probabilmente, 'net rpc file close' probabilmente non funziona perché la comunicazione tra processi che dice a Samba di chiudere il file finisce per non essere guardata fino a quando il file che vuoi chiudere non viene letto.

Se non esiste un'opzione esplicita in samba, sarebbe impossibile chiudere esternamente un descrittore di file aperto con interfacce unix standard.

In generale, non è possibile immischiarsi con un descrittore di file di processo dall'esterno. Tuttavia, come root puoi ovviamente farlo come visto in quell'articolo di frase del 1997: http://www.phrack.org/issues.html?issue=51 & amp; id = 5 # article - Non consiglierei di farlo su un sistema di produzione però ...

La domanda migliore in questo caso sarebbe perché? Perché vuoi chiudere un file in anticipo? Che scopo ha in definitiva chiudere il file? Cosa stai cercando di realizzare?

Samba fornisce comandi per visualizzare i file aperti e chiuderli.

Per elencare tutti i file aperti:

file rpc netto -U ADadmin% password

Sostituisci ADadmin e password con le credenziali di un amministratore di dominio Windows AD. Questo ti dà un ID file, un nome utente di chi lo ha aperto, lo stato di blocco e il nome file. Spesso vorrai filtrare i risultati eseguendo il piping tramite grep.

Dopo aver trovato un file che si desidera chiudere, copiare il numero ID del file e utilizzare questo comando:

net rpc file close fileid -U ADadmin% password

Avevo bisogno di realizzare qualcosa del genere, in modo da poter facilmente smontare i dispositivi che condividevo. Ho scritto questo veloce script 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

Ci vuole un solo argomento, i percorsi per chiudere:

smbclose /media/drive

Ogni percorso che corrisponde a quell'argomento (per grep) è chiuso, quindi dovresti essere piuttosto specifico con esso. (Sono interessati solo i file aperti tramite samba.) Ovviamente, è necessario root per chiudere i file aperti da altri utenti, ma funziona bene per i file aperti. Si noti che come con qualsiasi altra forza di chiusura di un file, può verificarsi il danneggiamento dei dati. Fintanto che i file sono inattivi, dovrebbe andare bene però.

È piuttosto brutto, ma per il mio caso d'uso (chiusura di interi punti di montaggio) funziona abbastanza bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top