26 agosto 2015

Apagado rápido con systemd

Siguiendo con mi aclamada serie "Systemd y la puta madre que lo parió a él y al deficiente mental de Poettering", vamos a ver hoy cómo solucionar un temita la mar de cachondo que ya me he encontrado con más de una y más de dos máquinas con esta puta mier^H^H^H maravilla gestionando sus recursos.

El tema es que durante el reinicio/apagado del sistema, podemos encontrarnos con algún job de systemd que se queda pilado durante minuto y medio antes de dar timeout, forzar salida y continuar. Esto es especialmente divertido si tienes montados sistemas de ficheros en red, ya que como systemd está tan bien parido, baja la red antes de desmontar los recursos. Así que tienes un minutito y medio de espera por cada punto de montaje que tengas. Si a eso le añades un slapd o algún otro servicio porculero como apache, te puedes tirar un buen rato mirando el mensajito ése tan gracioso de:
[***] A stop job is running for suputamadrecagando

Bueno, yo me lo he montado para solucionarlo de dos maneras distintas, en función de si se trataba de un servicio o de sistemas de ficheros en red montados.

Para solucionar el problema de un servicio que se engancha, basta con localizar el archivo .service relativo al mismo (usualmente en /usr/lib/systemd/system, aunque puede variar) y añadirle ésto:

KillMode=none

Al principio de la sección [Service].

En cuanto a la solución para recursos de red montados, es un poco más elaborada. Y pasa por asegurarnos de desmontar todos los puntos de montaje que se correspondan a un share de red antes de llevar a cabo el apagado/reinicio.

Yo he optado por montar un script mierder pero eficaz como éste:

#!/bin/bash
CIFS=`mount | grep cifs |awk '{print $3}'`
NFS=`mount | grep nfs | awk '{print $3}'`
for i in $CIFS; do
umount $i
done
for i in $NFS; do
umount $i
done

Luego toca asegurarnos de que el script se ejecute antes del proceso de apagado propiamente dicho. Para ello, podemos editar los archivos systemd-poweroff.service, y systemd-reboot.service (no confundir con el archivo reboot.service que es un enlace a /dev/null, tócate los cojones Mariloli), una vez más seguramente en /usr/lib/systemd/system. Le añadimos la siguiente línea:

ExecStart=/ruta/al/script

En la sección [Service], justo después de la línea:

Type=oneshot

Que aparece en ambos.

Es rápido, duro, feo y seguramente traerá problemas. Pero funciona.

Tomado de: http://blogdrake.net/blog/vfmbofh/apagado-rapido-con-systemd