script - Reemplazando un ejecutable en ejecución en linux
script linux ejemplos (3)
Tengo un sistema Linux integrado que puede actualizarse desde una tarjeta USB. El programa de interfaz detecta la inserción de USB y busca el ejecutable actualizado. Actualmente lo copio en un archivo local e instalo algunos comandos en rc5.d para copiar el archivo sobre el archivo exe existente en el siguiente arranque. Luego tengo que reiniciar el software.
¿Hay una mejor manera de hacer esto?
En Linux, puede reemplazar de forma segura el ejecutable en ejecución mientras se ejecuta el proceso. Mientras el proceso se esté ejecutando, esa instancia continuará utilizando el código "antiguo". Todas las nuevas llamadas a la aplicación utilizarán el código "nuevo". Entonces, simplemente reiniciando la aplicación (o el dispositivo si es necesario) utilizará la nueva copia.
Tenga en cuenta que debe tener cuidado si su aplicación va a cambiar los archivos de configuración o las bibliotecas, ya que pueden no residir en la memoria. En este caso, la apuesta más segura es hacer que un script haga lo que usted mencionó.
Está bien reemplazar el ejecutable mientras el programa se está ejecutando SI lo rm
(lo desvincula ) primero.
Esto no es lo que sucede con cp
, así que no uses eso. O bien mv
el archivo, o, para estar realmente seguro, rm
y luego coloque el nuevo en el mismo lugar. Si está haciendo esto con el código en el software incorporado, entonces debe comenzar con unlink(2)
.
Los núcleos Unix saben que el inodo todavía está en uso, y eliminarán la entrada del directorio para el archivo, pero no liberarán el inodo (y los bloques de datos) hasta que el recuento de referencias del inodo llegue a cero, y eso no sucederá mientras una instancia de ella se está ejecutando.
Es probable que esto no sea un problema con su sistema integrado, pero como precaución general, no cuente con que esto funcione para el almacenamiento en red, excepto cuando se encuentre en el propio servidor.
No es necesario que copie el archivo en el siguiente arranque. En su lugar, esta secuencia funcionará bien:
- Copiar nuevo ejecutable a un archivo local.
- Verificar archivo local.
- unlink () ejecutable existente.
- renombra () nuevo ejecutable al nombre correcto.
La aplicación seguirá ejecutándose después de unlink()
: el kernel no liberará los datos subyacentes hasta que todas las copias en ejecución hayan finalizado.
A continuación, puede simplemente utilizar execve()
para que el proceso que se está ejecutando se reemplace con la versión recién cargada.