2011-05-13 11 views

Respuesta

4

Puede cerrar un FD n del proceso actual en bash como tan:

exec n<&- 
+0

Gracias. Pero se usa para cerrar FD del proceso actual (proceso bash). ¿Conoces algún método para cerrar FD de un proceso específico? – Eric

0

No se puede ir por ahí cierre de descriptores de archivos de otros procesos y esperar que seguir trabajando.

Corrija el programa que tiene demasiados archivos abiertos para abrirlo menos. Esto puede ser un cambio de configuración o modificación de la fuente, etc. No puede cerrar los archivos para ello.

+8

Claro que puedes. Un caso común para querer hacer esto es porque el programa pierde fd; en cuyo caso nunca más los usará. Claro, es un error, pero sigue siendo válido querer evitarlo. –

+0

En mi caso, tuve un proceso prolongado de lotes colgados porque una lectura de un socket http había muerto. Al cerrar el archivo fd como @ThomasVanderStichele describí el problema que me solucionó :-) –

24

Definitivamente puede cerrar archivos fd de otros procesos en ejecución, siempre que tenga los permisos para hacerlo.

Primero, encuentre el PID.

A continuación, inicie el BGF y asociar al proceso:

gdb -p 1598 

Luego, llame a la estrecha llamada al sistema en el fd desea cerrar:

(gdb) call close(999) 
$1 = 0 

Si el descriptor de archivo fue una filtró uno, entonces el programa nunca intentará usarlo de nuevo de todos modos, y no debería causar ningún problema. Sin embargo, el programa probablemente tiene un error.

2

He corrido en una situación similar, pero donde gdb no era una opción ya que interrumpía las restricciones en tiempo real de mi aplicación y distorsionaba mi prueba.

Así que se me ocurrió una regla rápida iptables. Argumentos opcionales puestos entre corchetes ([ opt ]).

  1. encontrar su dirección y puerto de destino:

    netstat --program [ --numeric-host --numeric-ports ] | grep [<pid>]/[<appname>]

    $ netstat --program --numeric-ports | grep 8812/ 
    tcp  0  0 ysc.xxx:54055   10.56.1.152:30000   ESTABLISHED 8812/my-application 
    tcp  0  0 ysc.xxx:46786   postgres.xxx:5432   ESTABLISHED 8812/my-application 
    tcp  0  0 ysc.xxx:36090   10.56.4.79:57000   ESTABLISHED 8812/my-application 
                 ... 
    unix 2  [ ]   DGRAM     7177020 8812/my-application 
    

    Aquí, me gustaría cortar 10.56.4.79:57000.

  2. crear una regla de iptables para cortar la toma:

    iptables -A OUTPUT [ --out-interface <if> --protocol <tcp|udp|unix> ] --destination <addr> --dport <port> --jump DROP

    $ iptables -A OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP 
    $ 
    
  3. En esta etapa, su programa no puede enviar paquetes al host remoto. En la mayoría de los casos, la conexión TCP está cerrada. Puede continuar con sus pruebas si hay algunas.

    $ netstat --program --numeric-ports | grep 8812/ 
    tcp  0  0 ysc.xxx:54055   10.56.1.152:30000   ESTABLISHED 8812/my-application 
    tcp  0  0 ysc.xxx:46786   postgres.xxx:5432   ESTABLISHED 8812/my-application 
                 ... 
    unix 2  [ ]   DGRAM     7177020 8812/my-application 
    
  4. quitar la regla iptables:

    Basta con escribir en la misma iptables regla de sustitución de la A por un D.

    $ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP 
    $ 
    
+0

Tenga en cuenta que mi intención era probar cómo reaccionaría mi aplicación si perdiera su conexión con un servicio crítico. – YSC

Cuestiones relacionadas