SecNot

abr 24, 2015

Scripts que se ejecutan sólo una vez

A veces es necesario un script shell que se ejecute una sola vez, por ejemplo cuando estas trabajando en una imagen de una maquina virtual o una distribución, y necesitas que se ejecute un script la primera vez que arranca el sistema. Estos scripts son faciles de escribir pero hay que tener cuidado con ciertos detalles que pueden dar problemas.

La primera aproximación es eliminar el script tras se ejecutado.

#!/bin/bash

# Tus comandos aqui

# Elimina el script antes de salir
rm $0

El problema de éste sistema es que $0 no devuelve la ruta del script sino que devuelve el nombre usado para su invocación, si se usó ruta absoluta no hay problema, pero si se usó relativa puede darse el caso que si se ha cambiado el directorio de trabajo durante su ejecución, no borrara el script o incluso puede borrar un archivo con el mismo nombre en otro directorio.

La solución es obtener la ruta absoluta del script antes al inicio, y usarla para borrar el archivo al finalizar.

#!/bin/bash
# Obtener ruta absoluta
RUTA_ABSOLUTA=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)/`basename "${BASH_SOURCE[0]}"`

# Tus comandos aqui

# Elimina el script
rm $RUTA_ABSOLUTA

Esto es suficiente en la mayoría de los casos, pero en algunas situaciones no es posible eliminar el script porque puede ser necesario posteriormente. En estos casos se usa un flag para determinar si el script ya se ha ejecutado.

#!/bin/bash

FLAG="/var/log/archivo-flag.log"
if [ ! -f $FLAG ]; then
    echo "Primera ejecucion del script"
    # Crear flag para recordar que se ejecuto
    touch $FLAG
else
    echo "El script solo se puede ejecutar una vez"
    exit 0
fi

# Tus comandos aqui

Aquí se ha usado un archivo como flag que es creado en la primera ejecución, cuando se intenta ejecutar el script posteriormente se detecta la existencia del archivo y no se continua con la ejecución. Si quisieras ejecutarlo una vez mas, no hay mas que eliminar el archivo flag.

Este sistema tampoco es perfecto, si por algún error se borra el archivo flag el script se ejecutaría de nuevo, por lo que hay que tener cuidado con donde y con que permisos se crea.

Y eso es todo, elige el método que mas te guste.