¿ Cuanto tarda tu sistema en arrancar ?

11.10.2020

Importante: Esta información es para uso lúdico personal. En ningún caso se pretende dar conocimientos, consejos, formaciones, herramientas, ni soluciones técnicas de ámbito comercial ni profesional. Simplemente es información que se ha redactado en finalidad de recordatorio de ciertos proyectos realizados. Si no cumple con sus expectativas o no es de su agrado,le ruego que abandone este sitio web

Un comando te lo dice y otro acusa a los culpables

¿Cuánto tarda en arrancar tu sistema? ¿Lo has medido alguna vez? Con un solo comando puedes comprobarlo de forma rápida y no solo eso: con otro comando puedes, además, ver cuáles son los procesos que más retrasan el, valga la redundancia, proceso de arranque.

Cabe mencionar que ninguna mejora de software o hardware ha ayudado a agilizar el arranque del sistema como lo han hecho las unidades SSD, por lo que si no tienes el sistema instalado en una, las diferencias que encontrarás con la muestra que puedes ver más abajo te van a dejar con cara de pocos amigos.

Sin más, puedes comprobar cuánto tarda en arrancar tu sistema con el siguiente comando:

systemd-analyze

Y si quieres saber cuáles son los servicios que más demoran el arranque, le añades la siguiente opción:

systemd-analyze blame

Como digo, la imagen se explica por sí sola: la primera cifra se refiere a lo que ha tardado en arrancar el kernel y la segunda al espacio de usuario, aunque hay una tercera que matiza lo que se ha tardado en levantar el sistema gráfico. En total, 9,2 segundos. Y en el siguiente comando se muestran los servicios que más tiempo han consumido.

Esta medición de systemd tiene en cuenta el tiempo transcurrido desde que inicia el cargador de arranque hasta que aparece la pantalla de inicio de sesión. Además de la curiosidad, puede ayudar a determinar si algún servicio está ralentizando el arranque y tomar cartas en el asunto (¡ojo con lo que tocas!). Aquí tienes toda la información sobre este comando.

Por supuesto, no hace falta decir que esto solo funciona en sistema que usen systemd, ¿verdad? Y como en la práctica son la amplia mayoría de distribuciones GNU/Linux... (Para los curiosos, la distribución de la captura es Ubuntu 19.10 recién instalada y con un par de snaps de más).

Y bien. ¿Cuánto tarda en arrancar tu sistema?

Cómo habilitar o deshabilitar servicios al inicio de sesión

Pasa en ocasiones que instalas alguna aplicación que depende de algún servicio y el proceso se queda ahí, ad eternum, aunque solo lo uses de vez en cuando. O al revés: te toca estar iniciando un servicio que usas siempre y que por alguna razón no se fijó al arranque de la sesión cuando lo instalaste. Todo esto, en el tiempo de systemd, se soluciona con sus propios comandos.

Lo primero que explico me ha pasado últimamente, por ejemplo, con Plex, que uso de uvas a peras, o con MPD (Music Player Daemon), dependencia del reproductor de música Cantata que aún uso menos. Cada vez que abría el monitor de sistema y veía el proceso de Plex o MPD me decía «a ver cuándo quito eso»... hasta el día en el que te hartas y lo miras. Porque, ojo, aquí hablamos de sistemas de escritorio, donde este tipo de cosas no deberían suceder tan a la ligera.

Pero resolverlo es, como he dicho, cuestión de aprenderse un par de comandos, siempre que tengamos bien localizado el servicio correspondiente. En este caso y en otros tantos, esos servicios llevan el mismo nombre del proceso, por lo que no es difícil de adivinar. Primero hay que comprobar que el servicio está habilitado al inicio de la sesión:

systemctl is-enabled nombredelservicio

Y después, según queramos habilitarlo o deshabilitarlo (estos comandos deben lanzarse como administrador):

systemctl enable nombredelservicio
systemctl disable nombredelservicio

Por cierto, systemd nombra los servicios como nombredelservicio.service, pero los comandos funcionan bien sin la extensión.

Vuelvo a recordar que esta es la forma de habilitar o deshabilitar servicios al inicio de sistema solo en distribuciones que usen systemd, que actualmente son la inmensa mayoría en GNU/Linux. Por otro lado, hay administradores gráficos para estas cosas, pero no son accesibles en todas las distribuciones y su uso puede resultar más complejo que lanzar un simple comando.

Crear script de arranque para un servicio en Linux

Puede que se dé el caso, que se quiera arrancar un script PHP cómo servicio o demonio. Esto es útil para procesos que realizan operaciones en background. 

En este caso, hay un aplicación en PHP llamada «enin», que se ejecuta con el archivo «core.php» mediante CLI PHP.

/var/www/enin/core.php

El archivo de arranque del servició será así. El código es simple y se entiende por si solo.

vim /etc/init.d/enin o nano /etc/init.d/enin

# Añadir
#! /bin/sh
NAME=enin
DESC="ENIN Deamon"
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"
DAEMON="/usr/bin/php"
DAEMON_OPTS="/var/www/enin/core.php"
START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting ${DESC}: "
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon $STOP_OPTS
echo "$NAME."
rm -f $PIDFILE
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon $STOP_OPTS
sleep 1
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0

Dar permisos de ejecución

chmod +x /etc/init.d/enin

Para arrancar o detener el servicio usar:

service enin start
service enin stop

o también

/etc/init.d/enin start
/etc/init.d/enin stop

Ejecutar un script al arrancar Linux (debian)

Normalmente Debian corre en el runlevel 2 por defecto.

Esto quiere decir, que si entras en /etc/rc2.d/ encontraras allí una lista de todos los scripts que se ejecutan al arrancar el sistema. Si nos fijamos bien todos son enlaces simbólicos a archivos que se encuentran en /etc/init.d/ que es donde están todos los daemon ,es decir, todo lo que funciona independientemente y sin emitir en la Consola un mensaje para el usuario.

De modo que para ejecutar un script o programa al arranque del sistema, primero es necesario darle características de daemon y posteriormente crees un enlace simbolico de este daemon en la carpeta /etc/rc2.d/ de la siguiente forma:

1) Darle permiso de ejecución al script, abre un Terminal y en la carpeta donde se encuentra el script digita:

$ sudo chmod +x nombredetuscript

2) Copiarlo a la carpeta /etc/init.d/

$ sudo cp nombredetuscript /etc/init.d

3) Lo hacemos daemon, es decir que se ejecute al inicio de la sesión

$ sudo update-rc.d nombredetuscript defaultsPara borrar un script haríamos:
$ sudo update-rc.d miscript.sh remove

Esto borra únicamente los enlaces simbólicos, no el script; y siempre y cuando se haya borrado el script previamente. Si se quiere borrar los enlaces aunque no se haya borrado el script, hay que utilizar la opción -f (force):

$ sudo update-rc.d -f miscript.sh removeEsto quiere decir, que si entras en /etc/rc2.d/

Encontraras allí una lista de todos los scripts que se ejecutan al arrancar el sistema. Si nos fijamos bien todos son enlaces simbólicos a archivos que se encuentran en /etc/init.d/ que es donde están todos los daemon ,es decir, todo lo que funciona independientemente y sin emitir en la Consola un mensaje para el usuario.

De modo que para ejecutar un script o programa al arranque del sistema, primero es necesario darle características de daemon y posteriormente crees un enlace simbolico de este daemon en la carpeta /etc/rc2.d/ de la siguiente forma:

1) Darle permiso de ejecución al script, abre un Terminal y en la carpeta donde se encuentra el script digita:

$ sudo chmod +x nombredetuscript

2) Copiarlo a la carpeta /etc/init.d/

$ sudo cp nombredetuscript /etc/init.d

3) Lo hacemos daemon, es decir que se ejecute al inicio de la sesión

$ sudo update-rc.d nombredetuscript defaultsPara borrar un script haríamos:
$ sudo update-rc.d miscript.sh remove

Esto borra únicamente los enlaces simbólicos, no el script; y siempre y cuando se haya borrado el script previamente. Si se quiere borrar los enlaces aunque no se haya borrado el script, hay que utilizar la opción -f (force):

$ sudo update-rc.d -f miscript.sh remove