El post que buscas se encuentra eliminado, pero este también te puede interesar

Crear initscripts en OpenRc

Anuncios


Hola compañeros,

En este post trataré de explicarles, muy básicamente, como crear un script de inicio (initscript) y como convertirlo en demonio en openrc.

Un initscript puede ejecutarse e inmediatamente salir o permanecer en memoria y ejecutarse indefinidamente o salir dada una condición. A esto último se le llama demonio o servicio.

En openrc el formato de los initscripts es muy sencillo:

El esquema básico seria así:


#!/sbin/runscript
# $Header: $

 depend() {
 }

 start() {
 }

 stop() {
 }


A este esquema debemos agregarles los comandos según nuestras necesidades. También podemos crear nuestras propias funciones.
Importante: start-stop-daemon no iniciará nuestro script si algunos de los campos (depend, start o stop) están vacíos.


La funcion depend ()


Con la función depend podemos cargar las dependencias que podemos llegar a necesitar; así como el orden de carga con condiciones de nuestro script.
Desde aquí podremos cargar el sistema de archivos, red, etc.
por ejemplo, si quisiera cargar el sistema de archivos e indicarle a start-stop-daemon que ejecute el script antes de xdm:


 depend () {
    need localmount
    before xdm
 }

need indica la dependencia (tambien se puede usar use, pero recomiendo que usen need). Con after y before indicamos cuando se iniciará el script.


La funcion start ()


Dentro de esta función podemos crear el cuerpo de nuestro script o iniciar una aplicación ya realizada y guardada en un archivo.
Como ejemplo de un script (muy básico) que encenderá el numlock, capslock y scroll antes de xdm, dando un retardo de 5 segundos para que sea visible:


 start() {
    ebegin "Activando leds del teclado..."
    setleds -D +num + caps +scroll
    sleep 5

    eend $? 
}

ebegin y eend son recomendables en lugar de echo, ya que se apegan al formato de salida standard de openrc.


La funcion stop()


Dentro de esta función indicamos la parada de la aplicacion.


stop() {
    ebegin "Deteniendo script..."
    eend $?
 }



Creando funciones propias.


En un script mas complejo es sumamente util la utilizacion de funciones propias, ya que nos ahorraran muchas lineas de codigo.
Un ejemplo de una funcion para hacer lo que mostraba anteriormente. Crearemos la funcion xleds para activar los leds:


#!/sbin/runscript
# $Header: $

depend() {
    before xdm
}

xleds () {

    if [ "$1" = "activar" ]; then
    setleds -D +caps +num +scroll
    else
    eend $?
fi
}
 
 start() {
    ebegin "Activando Numlock..."
    xleds activar
    sleep 5

    eend $? 

}

 stop() {
    ebegin "Deteniendo script..."
    eend $?
 }




Usando start-stop-daemon para demonizar nuestras aplicaciones.


Supongamos que ya tenemos nuestra aplicacion (la cual llamaremos misleds) ya creada y necesitamos cargarla en memoria (background); es muy sencillo con start-stop-daemon.


start() {
    ebegin "Iniciando misleds..."
    start-stop-daemon --background --start --exec /home/mabas/misleds
    eend $?
}


Si aquí también necesitamos un retardo en ejecutar, podemos usar el parámetro --wait.


start() {
    ebegin "Iniciando misleds..."
    start-stop-daemon --wait 5000 --background --start --exec /home/mabas/misleds
    eend $?
}


También seria conveniente identificar nuestra aplicación para poder ubicarla y eventualmente detenerla. Para eso es necesario asignarle un PID.
Esto se consigue mediante el parámetro --make-pidfile de start-stop-daemon.


start() {
    ebegin "Iniciando misleds"
    start-stop-daemon --background --start --exec /home/mabas/misleds --make-pidfile --pidfile /home/mabas/misleds.pid
    eend $?
}


Con el PID generado luego podremos detener la aplicacion muy facilmente.

Tengan en cuenta que start-stop-daemon por defecto inicia las aplicaciones como root, si necesitan que lo haga como un usuario normal solo deben agregar el parámetro -u.

start() {
    ebegin "Iniciando misleds"
    start-stop-daemon --background --start --exec /home/mabas/misleds -u mabas --make-pidfile --pidfile /home/mabas/misleds.pid
    eend $?
}


Para detener nuestra aplicación podemos hacerlo de dos maneras:

Por su nombre:


stop() {
    ebegin "Deteniendo misleds..."
    start-stop-daemon --stop --exec /home/mabas/misleds
    eend $?
}


..o por su PID (que ya hemos creado anteriormente):

stop() {
    ebegin "Deteniendo misleds..."
    start-stop-daemon --stop --exec /home/mabas/misleds --pidfile /home/mabas/misleds.pid
    eend $?
}



Iniciando, recargando y deteniendo nuestro script.


Guardamos nuestro script de inicio (initscript) en /etc/init.d.

Le damos permisos de ejecución:

chmod +x /etc/init.d/misleds

Para ejecutarlo:

/etc/init.d/misleds start


Para recargarlo:

/etc/init.d/misleds reload


Para detenerlo:

/etc/init.d/misleds stop



Agregando nustro script a un runlevel especifico.


Openrc tiene cuatro runlevels preestablecidos: boot, default, shutdown y sysinit.
La manera de agregar el script a un runlevel es la siguiente:

rc-update add misleds default


En este caso la agregue al runlevel default. Si no saben en que runlevel agregar sus scripts, usen default.
Podemos chequear que ha sido agregada con

rc-status


Esto seria lo básico.

No me quedó muy organizado (xD) . Cualquier cosa me avisan.

Saludos

3 comentarios - Crear initscripts en OpenRc