09EneArrancar ubuntu en modo texto para ejecutar un script en php

A lo mejor es una información muy específica, pero si pos casualidad la buscabas aquí la tienes, como he aprendido muchas otras cosas en el proceso, os las cuento…

Unix tiene varios niveles de ejecución o modos que arrancan el equipo con diferentes servicios. Es algo así como los clásicos modos de arranque en Windows.

El nivel con el que arrancar aparece en el archivo inittab que en linux deberíamos encontrar en etc/intitab pero que no está presente en ubuntu.

Ubuntu dispone de un script que elige el nivel de ejecución en el que se arranca el sistema operativo. Ese archivo tiene la siguiente forma:

  1.  
  2. # rc - runlevel compatibility
  3. #
  4. # This task guesses what the "default runlevel" should be and starts the
  5. # appropriate script.
  6.  
  7. start on stopped rcS
  8.  
  9. script
  10.         runlevel –reboot || true
  11.  
  12.         if grep -q -w — "-s|single|S" /proc/cmdline; then
  13.             telinit S
  14.         elif [ -r /etc/inittab ]; then
  15.             RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
  16.             if [ -n "$RL" ]; then
  17.                 telinit $RL
  18.             else
  19.                 telinit 2
  20.             fi
  21.         else
  22.             telinit 2
  23.         fi
  24. end script
  25.  

En telinit se especifica el nivel que se arranca por defecto en este caso el 2. En ubuntu el nivel 1 es modo texto a prueba de fallos (no se activan las funciones de red y es monousuario) y los niveles restantes son idénticos. Nosotros queremos hacer que la interfaz gráfica no se active de partida (la activaremos nosotros con nuestro script), y arrancar en modo texto.

Para ello lo que hacemos es dirigirnos a los directorios de los diferentes niveles nombrados como /etc/rcX.d, donde X es el nivel.

Nosotros vamos a hacer que Ubuntu arranque en el nivel 2. Eso lo hemos hecho al modificar el script anterior. Posteriormente entraremos en el directorio rc2.d y renombraremos los servicios que no queremos que se activen, es decir configuraremos a medida el nivel 2 para que cumpla nuestro propósito. Estos son algunos archivos que nos pueden aparecer:

En nuestro caso vamos a renombrar _S30gdm para que no se active la interfaz gráfica al arrancar. Estos archivos contienen enlaces simbólicos a los servicios que deben ejecutarse.

Ahora añadiremos S92cloud, y crearemos un enlace simbólico a nuestro programa de ejecución que vamos a crear en /etc/init.d y al que llamaremos “cloud”. Este script ejecutará php al arrancar y abrirá la interfaz gráfica. Esto lo haremos con la llamada:

  1.  
  2. ln -s ../init.d/cloud S92Cloud

Y en /etc/init.d creamos nuestro archivo: cloud, con el siguiente código:

  1.  
  2. #! /bin/sh
  3.  
  4. case "$1" in
  5.   start)
  6.         /usr/bin/X &
  7.         export DISPLAY=0.0
  8.         /usr/bin/xhost +
  9.         /usr/bin/php /var/www/metro/arranca_estacion.php
  10.   ;;
  11.   stop)
  12.         PID=$(/bin/ps -ef|/bin/grep "/usr/bin/php /var/www/metro/arranca_estacion.php"|grep -v grep|awk {‘print $2′})
  13.         /bin/kill $PID
  14.         PID=$(/bin/ps -ef|/bin/grep "X"|grep -v grep|awk {‘print $2′})
  15.         /bin/kill $PID
  16.   ;;
  17.   *)
  18.         echo "Usage: $SCRIPTNAME {start|stop}" >&2
  19.         exit 3
  20.   ;;
  21. esac
  22.  
  23.  

Explicación del script:

Hacemos un case con $1 que es el primer parámetro ($0 es el nombre del programa, en nuestro caso sería cloud).

El start contiene el siguiente código:

1.    Ejecutamos la interfaz gráfica: /usr/bin/X
2.    export DISPLAY=0.0 , establecemos el DISPLAY actual, para posteriormente dar acceso a cualquier usuario. Conforme se abren sucesivas interfaces se les asigna un número la primera que hemos abierto en la línea 1 de nuestro scriopt es la 0.0
3.    /usr/bin/xhost + , por defecto la interfaz gráfica sólo la puede emplear el usuario que la ha activado. Si queremos que otro usuario la emplee (en nuestro caso el usuario de al web www-data) necesitamos darle acceso. Si hacemos xhost+ un proceso ejecutado por un usuario cualquiera tendría acceso a la interfaz gráfica.
4.     /usr/bin/php /var/www/metro/arranca_estacion.php . Ejecutamos el php para arrancar el script de php.

Y el stop hace lo siguiente:

  1.  PID=$(/bin/ps -ef|/bin/grep "/usr/bin/php /var/www/metro/arranca_estacion.php"|grep -v grep|awk {’print $2′})
    /bin/kill $PID

por partes:
/bin/ps->ps -ef → muestra lso procesos activos.
|/bin/grep "/usr/bin/php /var/www/metro/arranca_estacion.php”-> grep filtra los procesos, sólo queremos quedarnso con el nuestro para obtener el pid del proceso y poder matarlo.
grep -v  grep| ->eliminamos de los resultado la línea que corresponde al propio proceso grep que estamos ejecutando ahora. Sino a parte del proceso que buscamos nos devolvería éste.
awk{’print $2′}-> sacamos el segundo campo que es el pid del proceso. 

 
 PID=$(/bin/ps -ef|/bin/grep "X"|grep -v grep|awk {’print $2′})
        /bin/kill $PID

->matamos la interfaz gráfica.
 


 

Mayo 2012
L M X J V S D
« May    
 123456
78910111213
14151617181920
21222324252627
28293031