systemd, configurar un script como servicio.
Tags: systemd, linux
Published: 2020-09-12 23:27:53

Ya hace algún tiempo que **systemd** está entre nosotros y, parece que no tiene intención de desaparecer, ya que ha sido adoptado por la mayoria de **distribuciones linux**. Así que será mejor que nos hagamos a la idea y empecemos a aceptarlo como un compañero más que estará entre nosotros.

Para romper el hielo, nada mejor que hacer una prueba de concepto y definir nuestro propio servicio.

Procederemos a crear el script que queremos ejecutar como servicio, que aunque con poca utilidad, nos permitirá comprobar el correcto funcionamiento de nuestra configuración.

```bash
#!/bin/bash

# La única finalidad de este script es probar el proceso
# de configuración de un servicio en systemd.

# Enviamos mensaje inforamtivo del inicio de nuestro servicio.
echo "mi-servicio.service   *** iniciando ***" | systemd-cat -p info

# realizamos un loop infinito que mantendrá nuestro escript en ejecución.
# Grabaremos la hora cada minuto en el log del sistema.
while true; do
   ahora=$(date '+%Y-%m-%d %H:%M:%S') 
   echo "mi-servicio: $ahora" | systemd-cat -p info
   sleep 60
done
```

Aunque no es requisito que se encuentre en alguna ubicación concreta, lo copiaremos a **/usr/local/bin** que es el sitio recomendado para la instalación de nuestros programas.

```bash
sudo cp mi-servicio.sh /usr/local/bin
```

Naturalmente, tenemos que asegurarnos que sea ejecutable.

```bash
sudo chmod +x /usr/local/bin/mi-servicio.sh
```

Ahora, deberemos crear el fichero de configuración del servicio dentro del directorio **/etc/systemd/system/** que por convención lo llamaremos **mi-servicio.service**, pero antes, nos aseguraremos que no se esté utilizando ya este nombre.

```bash
sudo systemctl list-unit-files --type=service
```

Como seguramente la lista será larga, podemos optar por filtrar la salida del comando.

```bash
sudo systemctl list-unit-files --type=service | grep mi-servicio
```

Si no aparece nada, podremos utilizar el nombre elegido. Así que, seleccionamos nuestro editor favorito y añadimos un contenido parecido al siguiente:

```ini
[Unit]
Description=Mi servicio super-útil

[Service]
ExecStart=/usr/local/bin/mi-servicio.sh

[Install]
WantedBy=multi-user.target
```

Aunque existen muchos más parámetros disponibles, nos hemos limitado a especificar el mínimo indispensable, que en este caso proporcionan una descripción, indican el programa a ejecutar y que esté disponible cuando el sistema se inicie en modo multiusuario con red (nuestro antiguo runlevel 3).

Como ya hemos convenido, lo salvaremos con el nombre **/etc/systemd/system/mi-servicio.service**

No se requiere que el fichero sea ejecutable, pero si es muy conveniente modificar los permisos.

```bash
sudo chmod 640 /etc/systemd/system/mi-servicio.service
```

Vamos a ver que tal pinta tiene lo realizado

```bash
sudo systemctl status mi-servicio
```

Si obtenemos algo parecido a lo siguiente, será indicativo de que el fichero de configuración es correcto.
```
● mi-servicio.service - Mi servicio super-útil
   Loaded: loaded (/etc/systemd/system/mi-servicio.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
```

Si es así, ya tenemos nuestro servicio, que podremos administrar como cualquier otro. Procedamos pues a iniciarlo.

```bash
sudo systemctl start mi-servicio
```

Si todo ha ido bien, cuando miremos su status, tendrá un aspecto similar a la siguiente:

```bash
sudo systemctl status mi-servicio
```
```
● mi-servicio.service - Mi servicio super-útil
   Loaded: loaded (/etc/systemd/system/mi-servicio.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-09-13 01:12:27 CEST; 25s ago
 Main PID: 17095 (mi-servicio.sh)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/mi-servicio.service
           ├─17095 /bin/bash /usr/local/bin/mi-servicio.sh
           └─17117 sleep 60

sep 13 01:12:27 P1912 systemd[1]: Started Mi servicio super-útil.
sep 13 01:12:27 P1912 cat[17116]: mi-servicio: 2020-09-13 01:12:27
```
**Eureka !!!** ya tenemos nuestro servicio funcionando.