Scripts de inicio INIT para openSUSE

En un artículo anterior que trataba sobre Iperf en openSUSE había mencionado que si queremos que esta herramienta automáticamente se ejecute como un servicio y demonio cada vez que inicie el sistema operativo necesitamos crear un script de arranque.

Pues bien, en este artículo justamente se va a tratar la creación de ese script de arranque para openSUSE utilizando como ejemplo a la herramienta Iperf.

Si bien la mayoría de las distribuciones Linux están migrando paulatinamente a Upstart como demonio Init (como también lo ha anunciado openSUSE), los scripts de arranque seguirán manteniendo su formato y estructura durante buen tiempo, principalmente por cuestiones de compatibilidad.

Para crear un script de inicio para el servicio Iperf podemos seguir los siguientes pasos:
  1. Nos conectamos con el usuario root, creamos un archivo llamado iperfd en el directorio /etc/init.d y le asignamos los permisos de ejecución adecuados:
    testsrv:~ # touch /etc/init.d/iperfd
    testsrv:~ # chmod 755 /etc/init.d/iperfd

  2. Editamos el archivo iperfd creado en el paso anterior,
    testsrv:~ # vi /etc/init.d/iperfd
    y le agregamos el siguiente texto:
    #!/bin/sh
    # Author: Gabriel K
    #
    # /etc/init.d/iperfd
    #
    ### BEGIN INIT INFO
    # Provides: iperf
    # Required-Start: $network
    # Required-Stop: $network
    # Default-Start: 3 5
    # Default-Stop: 0 1 2 6
    # Short-Description: Iperf
    # Description: Tool To Measure Network Performance.

    ### END INIT INFO

    PROGRAM=/usr/bin/iperf

    . /etc/rc.status

    # The echo return value for success (defined in /etc/rc.config).
    return=$rc_done
    case "$1" in
    start )
    echo -n "Starting service iperfd "
    ##
    ## Start daemon with startproc(8). If this fails
    ## the echo return value is set appropriate.

    startproc -q $PROGRAM -s -D
    rc_status -v
    ;;

    stop )
    echo -n "Shutting down service iperfd "
    ## Stop daemon with killproc(8) and if this fails
    ## set echo the echo return value.

    killproc -g $PROGRAM
    rc_status -v
    ;;

    try-restart )
    $0 status
    if test $? = 0; then
    $0 restart
    else
    rc_reset
    fi
    rc_status
    ;;

    restart )
    $0 stop
    $0 start
    rc_status
    ;;

    status )
    echo -n "Checking for service iperfd: "
    ## Check status with checkproc(8), if process is running
    ## checkproc will return with exit status 0.

    checkproc $PROGRAM
    rc_status -v
    ;;

    * )
    echo "Usage: $0 {start|stop|restart|reload|force-reload|status|try-restart}"
    exit 1
    ;;
    esac
    rc_exit
    Enlace: Script en Github Gist.


    Algunas observaciones con respecto al script anterior:
    • Todo lo resaltado son opciones que fueron agregadas y personalizadas, y son específicas para la ejecución de iperf.
    • El parámetro -g del comando killproc es fundamental para el caso en que el servicio a detener cuente con varios procesos hijos.
    • La sección comentada al inicio del script es muy importante porque contiene información fundamental como la definición de los niveles de ejecución, las dependencias para la ejecución de la aplicación, etc.
  3. Con lo hecho hasta el momento ya podemos arrancar, parar, reiniciar, ver el estado de ejecución del servicio, etc. de forma manual mediante la ejecución de los siguientes comandos:
    testsrv:~ # service iperfd start
    testsrv:~ # service iperfd restart
    testsrv:~ # service iperfd status

    redirecting to systemctl
    iperfd.service - LSB: Iperf
    Loaded: loaded (/etc/init.d/iperfd)
    Active: active (running) since Tue, 12 Jun 2012 19:54:18 -0400; 16s ago
    Process: 4471 ExecStop=/etc/init.d/iperfd stop (code=exited, status=0/SUCCESS)
    Process: 4482 ExecStart=/etc/init.d/iperfd start (code=exited, status=0/SUCCESS)
    CGroup: name=systemd:/system/iperfd.service
    └ 4494 /usr/bin/iperf -s -D
    testsrv:~ # service iperfd stop
  4. El siguiente paso consiste en activar el script de arranque en los niveles de ejecución para su inicio automático durante el arranque del OS. Por defecto el arranque se dará en los niveles de ejecución 3 y 5 como bien se ha definido en la directiva Default-Start de la cabecera del script, en fin, el comando es el que sigue a continuación:
    testsrv:~ # chkconfig --add iperfd
    iperfd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
    testsrv:~ #
    Para listar los niveles de ejecución en los cuales se inicia el servicio que hemos registrado lo podemos hacer como sigue:
    testsrv:~ # chkconfig --list iperfd
    iperfd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
    testsrv:~ #
    Si solo queremos deshabilitar el arranque automático del servicio podemos desactivar los niveles de ejecución:
    testsrv:~ # chkconfig iperfd off
    También podemos volver a activar el servicio en los niveles de ejecución de la siguiente manera:
    testsrv:~ # chkconfig iperfd on
    Si queremos definir manualmente los niveles de ejecución para nuestro servicio primero debemos desactivar los niveles de ejecución configurados por defecto y luego especificar los nuevos niveles de ejecución, esto lo podemos hacer con los siguientes comandos:
    testsrv:~ # chkconfig --level 35 iperfd off
    testsrv:~ # chkconfig --level 345 iperfd on

    Para desactivar completamente el arranque automático de los niveles de ejecución del sistema operativo lo podemos hacer de la siguiente forma:
    testsrv:~ # chkconfig --del iperfd
    iperfd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
    testsrv:~ #


Plantillas de ejemplo

En el directorio /etc/init.d/ se encuentran algunos archivos que pueden ser utilizados como plantillas para crear nuestros propios archivos de inicio para openSUSE. Estos son los siguientes:
/etc/init.d/skeleton
/etc/init.d/skeleton.compat



Enlaces interesantes

Comentarios