Pregunta

¿Hay alguna manera de forzar a un proceso Samba a cerrar un archivo determinado sin eliminarlo?

Samba abre un proceso para cada conexión de cliente y, a veces, veo que mantiene los archivos abiertos durante mucho más tiempo del necesario.Por lo general, simplemente finalizo el proceso y el cliente (de Windows) lo volverá a abrir la próxima vez que acceda al recurso compartido;pero a veces está leyendo activamente otro archivo durante mucho tiempo y me gustaría simplemente "eliminar" un archivo y no toda la conexión.

editar:Probé el 'cerrar archivo net rpc', pero no parece funcionar.¿Alguien sabe por qué?

editar: este es la mejor mención que he encontrado de algo similar.Parece ser un problema en el cliente win32, algo para lo que los servidores de Microsoft tienen una solución;pero Samba no.deseo el net rpc file close <fileid> El comando funcionó, seguiré intentando descubrir por qué.Acepto la respuesta de LuckyLindy, aunque no resolvió el problema, porque es el único procedimiento útil en este caso.

¿Fue útil?

Solución

Esto sucede todo el tiempo en nuestros sistemas, particularmente cuando se conecta a Samba desde una máquina Win98. Seguimos estos pasos para resolverlo (que probablemente sean similares a los suyos):

  • Vea qué computadora está usando el archivo (es decir, lsof|grep -i <file_name>)
  • Intente abrir ese archivo desde la computadora infractora, o vea si un proceso se está ocultando en el administrador de tareas que podemos cerrar
  • Si no tiene suerte, haga que el usuario salga de cualquier programa de red importante
  • Mata el proceso Samba del usuario desde Linux (es decir, kill -9 <pid>)

¡Desearía que hubiera una mejor manera!

Otros consejos

Estoy creando una nueva respuesta, ya que mi primera respuesta en realidad solo contenía más preguntas y realmente no fue de mucha ayuda.

Después de buscar un poco, no he podido encontrar ningún error abierto actual para la última versión de Samba, consulte el informe de error de Samba sitio web y crear un nuevo error.Esta es la forma más sencilla de conseguir que alguien sugiera ideas sobre cómo solucionarlo y que los desarrolladores analicen el problema.LuckyLindy dejó un comentario en mi respuesta anterior diciendo que así ha sido durante 5 años, bueno, el proyecto es de código abierto, la mejor manera de solucionar algo que está mal informándolo o proporcionando parches.

También encontré una entrada en la lista de correo: Archivos abiertos Samba, sugieren agregar posix locking=no al archivo de configuración, siempre y cuando no tenga los archivos entregados a través de NFS, no bloquear el archivo debería estar bien, es decir, si el archivo se mantiene bloqueado.

Si también quisiera, podría escribir un programa que use ptrace y se adjunte al programa, revise, desbloquee y cierre todos los archivos.Sin embargo, tenga en cuenta que esto podría dejar a Samba en un estado desconocido, lo que puede ser más peligroso.

La solución que ya he mencionado es reiniciar periódicamente samba como solución alternativa.Sé que no es una solución pero podría funcionar temporalmente.

Esto probablemente se responde aquí: Cómo cerrar un descriptor de archivo de otro proceso en sistemas unix

Supongo que 'cerrar archivo de red rpc' probablemente no funcione porque la comunicación entre procesos que le dice a Samba que cierre el archivo no se mira hasta que el archivo que desea cerrar se lee.

Si no hay una opción explícita en samba, sería imposible cerrar externamente un descriptor de archivo abierto con interfaces estándar de Unix.

En términos generales, no puede entrometerse con los descriptores de un archivo de proceso desde el exterior. Sin embargo, como root, por supuesto, puede hacerlo como lo vio en ese artículo phrack de 1997: http://www.phrack.org/issues.html?issue=51 & amp; id = 5 # article - No recomendaría hacerlo en un sistema de producción aunque ...

La mejor pregunta en este caso sería ¿por qué? ¿Por qué quieres cerrar un archivo temprano? ¿Qué propósito tiene en última instancia para cerrar el archivo? ¿Qué estás intentando lograr?

Samba proporciona comandos para ver archivos abiertos y cerrarlos.

Para enumerar todos los archivos abiertos:

archivo net rpc -U ADadmin%password

Reemplace ADadmin y contraseña con las credenciales de un administrador de dominio de Windows AD. Esto le proporciona una identificación de archivo, nombre de usuario de quién lo abrió, estado de bloqueo y nombre de archivo. Con frecuencia querrá filtrar los resultados al canalizarlos a través de grep.

Una vez que haya encontrado un archivo que desea cerrar, copie su número de identificación de archivo y use este comando:

archivo de red rpc cerrar fileid -U ADadmin%password

Necesitaba lograr algo como esto, para poder desmontar fácilmente los dispositivos que estaba compartiendo. Escribí este script rápido de 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

Se necesita un solo argumento, las rutas para cerrar:

smbclose /media/drive

Cualquier ruta que coincida con ese argumento (por grep) está cerrada, por lo que debe ser bastante específico con ella. (Solo los archivos abiertos a través de samba se ven afectados.) Obviamente, necesita root para cerrar los archivos abiertos por otros usuarios, pero funciona bien para los archivos que tiene abiertos. Tenga en cuenta que, como con cualquier otro cierre forzado de un archivo, se pueden producir daños en los datos. Mientras los archivos estén inactivos, debería estar bien.

Es bastante feo, pero para mi caso de uso (cierre de puntos de montaje completos) funciona bastante bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top