En Linux, ¿qué pasaría con un programa en ejecución cuando su archivo ejecutable haya sido modificado o eliminado?


12

Digamos que se /usr/local/bin/rubyestá ejecutando en segundo plano, y luego sobrescribimos rubycon una versión diferente, o incluso la eliminamos ruby.

¿Qué pasará con aquellos que ejecutan procesos de ruby?

Respuestas:


10

Depende exactamente de cómo se actualice el ejecutable. Si se abre el mismo archivo y se cambian partes del mismo, sucederán cosas malas. Si se elimina, el archivo se elimina de la estructura de directorios del sistema de archivos, pero en realidad no se desvincula (es decir, se elimina) hasta que el último proceso que lo tiene abierto lo haya ejecutado. Entonces, si se elimina el ejecutable y se escribe uno nuevo con el mismo nombre en su lugar, el antiguo debería continuar funcionando correctamente.


"Si se abre el mismo archivo y se cambian partes del mismo", ¿no es igual a "si se elimina el ejecutable y se escribe uno nuevo con el mismo nombre en su lugar"? ¿Querías decir que el archivo nuevo mv al archivo antiguo es malo pero el archivo rm viejo y luego el archivo cp nuevo al archivo antiguo están bien?
Jean

4

Seguirán adelante. Tal vez se estrellen horriblemente si intentan acceder a ellos mismos y recibir algo completamente incorrecto. No lo haría a menos que tuviera que :)


Sí. Actualizo manualmente el software todo el tiempo mientras se ejecutan los scripts.
John T

1
Para las secuencias de comandos es importante tener intrpreters recientes reales que funcionen con el descriptor de archivo abierto inicialmente. En este caso, está bien siempre que reemplace el archivo y no lo modifique. Para los binarios, generalmente funcionan en el FD mapeado inicialmente, por lo que no hay problema (a menos que modifique los archivos). Pero puede haber aplicaciones que abran el nombre del archivo para inspección y eso puede ser arriesgado (sin embargo, no puedo dar ningún ejemplo negativo). La mayoría de las distribuciones de Linux / gestores de paquetes funcionan bajo el supuesto de que está bien reemplazar binarios y bibliotecas (por tiempo limitado).
eckes

1

¿Qué pasará con aquellos que ejecutan procesos de ruby?

  1. hacer una copia de / usr / local / bin / ruby
  2. [si no se está ejecutando, ejecute / usr / local / bin / ruby]
  3. intente: rm / usr / local / bin / ruby
  4. y compruébalo tú mismo :)

1

Tengo entendido que el kernel de Linux tiene un componente llamado cargador que abre el archivo ejecutable en sí mismo, que contiene la imagen, durante el proceso de carga / vinculación, y una vez hecho con la vinculación a bibliotecas, etc., el cargador cierra el archivo. Por lo tanto, este proceso ocurre y se completa cuando el núcleo realmente lo inicia.

No estoy seguro de si es necesario hacer referencia al ejecutable original en el disco si el ejecutable luego trata de importar bibliotecas externas.

Yo diría, y según mi experiencia, si elimina el ejecutable en el disco, el ejecutable cargado en la memoria no se ve afectado. Del mismo modo, si el archivo ejecutable se reemplaza por versiones más nuevas, las que se ejecutan actualmente no se actualizan "automáticamente" a menos que se detengan y se vuelvan a lanzar.

Tuve problemas con un controlador RAID que hizo que todo el disco en el que se montó el directorio raíz y otras particiones actuara repentinamente como si estuviera desconectado. No se pudieron cargar nuevos programas, pero los que estaban en la memoria funcionaban bien, hasta que necesitaron archivos del disco.


Eso no suena muy eficiente. Creo que Windows lo mapearía en memoria, por lo que las páginas se cargan a pedido.
sashoalm
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.