Cómo cerrar un descriptor de archivo de otro proceso en sistemas unix


Puede usar el comando lsof para obtener descriptores de archivo para todos los procesos en ejecución, pero lo que me gustaría hacer es cerrar algunos de esos descriptores sin estar dentro de ese proceso. Esto se puede hacer en Windows, por lo que puede desbloquear fácilmente alguna aplicación.

¿Hay algún comando o función para eso?

Author: Seb, 2008-11-27

5 answers

En Windows puede usar un programa para hacerlo porque alguien escribió un programa que inserta un controlador de dispositivo en el núcleo en ejecución para hacerlo. Por cierto, puede ser peligroso hacer esto, porque después de cerrar un identificador que estaba utilizando una aplicación rota, la aplicación no sabe que el identificador se cerró, y cuando la aplicación abre algún otro objeto no relacionado, no sabe que el mismo identificador ahora podría referirse a algún otro objeto no relacionado. Realmente quieres matar a los rotos solicitud lo antes posible.

En Linux seguramente se puede utilizar el mismo tipo de técnica. Escriba un programa que inserte un módulo en el núcleo en ejecución. Comunícate con el módulo y dile qué manijas cerrar. Será igualmente peligroso hacerlo.

 2
Author: Windows programmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-27 07:48:07

No se por que estas tratando de hacer esto, pero deberias poder adjuntar al proceso usando gdb y luego llamar a close() en el fd. Ejemplo:

En una cáscara: cat

En otro shell:

$pidof cat
7213

$gdb -p 7213

...
lots of output
...

(gdb)

Ahora le dices a gdb que ejecute close(0):

(gdb) p close(0)

$1 = 0

(gdb) c

Continuing.

Program exited with code 01.
(gdb)

En el primer shell obtengo esta salida:

cat: -: Bad file descriptor

cat: closing standard input: Bad file descriptor
 75
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 18:36:28

No lo creo, pero lsof le da el PID del proceso que ha abierto el archivo, por lo que lo que puede hacer es matar por completo el proceso o al menos enviar una señal para dejarlo salir.

 3
Author: Fernando Miguélez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-27 07:51:15

Hay mucha menos necesidad de hacer esto en Unix que en Windows.

En Windows, la mayoría de los programas tienden a "bloquear" (en realidad niegan compartir) los archivos que abren, por lo que no pueden ser leídos/escritos/eliminados por otro programa.

En Unix, la mayoría de las veces esto no sucede. El bloqueo de archivos en Unix es principalmente de carácter consultivo, y solo bloqueará otros intentos de bloqueo, no las operaciones normales de lectura/escritura/eliminación. Incluso puede eliminar el directorio actual de un proceso.

Acerca del único situación esto aparece en el uso normal en Unix es cuando se trata de umount un sistema de archivos(cualquier referencia al sistema de archivos montado puede bloquear el umount).

 2
Author: CesarB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-29 18:09:21

Lo dudo. Los descriptores de archivo son process-local, stdout es 1 para todos los procesos, sin embargo, todavía hacen referencia a flujos únicos, por supuesto.

Tal vez sería útil más detalle, sobre el problema de bloqueo que está tratando de resolver.

 1
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-27 07:50:27