Cómo ejecutar un programa de Linux al inicio con systemd

¿Necesita iniciar un programa de Linux en el arranque? El software systemd proporciona una forma de hacerlo en cualquier distribución de Linux con systemd, que es la mayoría de ellos en estos días, incluido Ubuntu. Lo guiaremos a través del proceso de creación de un servicio integrado, e incluso habla con la revista.

Este tutorial demuestra cómo configurar un servicio del sistema que se inicia cuando inicia su sistema. Para iniciar un programa gráfico cuando inicie sesión, utilice el administrador de inicio de su escritorio.

Ejecución de programas al inicio

A veces, el software que instala en su computadora se engancha en el proceso de inicio de Linux, de modo que el programa se inicia automáticamente cada vez que se inicia la computadora. Puede lograr fácilmente este mismo comportamiento con sus propios programas y scripts, o de hecho con cualquier otro programa que esté en su computadora.

Los programas que se inician al inicio son controlados por systemd, el sistema y servicio gerente. systemd es el primer proceso que se ejecuta al inicio. Siempre ha identificacion de proceso (PID) 1. Todos los demás procesos que se ejecutan en su computadora son iniciados por systemd, o por un proceso que systemd ya ha iniciado.

Los programas que se ejecutan en segundo plano se denominan demonios o servicios. La «d» al final de systemd significa daemon. En este artículo, crearemos un servicio de ejemplo. Para marcar todas las casillas, nuestro servicio debe ser:

Integrado con systemd a través de un archivo de unidad de servicio
Lanzado al inicio
Controlable mediante systemctl, el interfaz de control para systemd
Capaz de escribir en la revista

Creación del programa de servicio

Necesitamos tener un programa que systemd lance. Crearemos un script simple, llamado «htg.sh». Este tutorial usa el editor de texto Gedit, pero puede usar el editor de texto que prefiera.

touch htg.sh
gedit htg.sh

toque htg.sh en una ventana de terminal

Se abrirá el editor gedit. Copie y pegue el siguiente texto en el editor.

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Guarde sus cambios y cierre el editor.

  Cómo jugar juegos de Sega Saturn en Retroarch en Linux

script htg.sh en el editor gedit

El guión no hace mucho, pero hay algunos puntos que vale la pena señalar.

Las dos líneas de eco se canalizan a través de systemd-cat, un programa que toma el salida de un programa y lo envía al diario. Se da prioridad a las entradas a la revista. Estamos usando la opción -p (prioridad) para indicar que nuestros mensajes son solo para información (info). No son errores ni advertencias importantes.
Hay un bucle while sin fin.
La variable TIMESTAMP se establece en la fecha y hora actuales. Esto se formatea en un mensaje y se envía a la revista.
Luego, el guión duerme durante 60 segundos.
Después de 60 segundos, se repite el ciclo. Por lo tanto, esta secuencia de comandos escribe un mensaje con marca de tiempo en el diario una vez por minuto.

Copiaremos el script al directorio / usr / local / bin.

sudo cp htg.sh /usr/local/bin

sudo cp htg.sh / usr / local / bin en una ventana de terminal

Y necesitamos hacerlo ejecutable:

sudo chmod +x /usr/local/bin/htg.sh

sudo chmod + x /usr/local/bin/htg.sh en una ventana de terminal

Creación del archivo de unidad de servicio

Cada programa que inicia systemd tiene un archivo de definición, llamado archivo de unidad de servicio. Esto contiene ciertos atributos que systemd puede usar para ubicar e iniciar el programa, y ​​para definir parte de su comportamiento.

Necesitamos crear un archivo de unidad para nuestro nuevo servicio, pero es prudente asegurarse de que ninguno de los archivos de unidad existentes tenga el nombre que queremos darle a nuestro nuevo servicio.

sudo systemctl list-unit-files --type-service

sudo systemctl list-unit-files --type-service en una ventana de terminal

Puede desplazarse por la lista de archivos de unidad, que está ordenada alfabéticamente, y comprobar que no se utiliza el nombre que desea utilizar.

Lista de archivos de unidad systemd en una ventana de terminal

Nuestro servicio se llamará «htg.service». Ningún archivo de unidad tiene ese nombre, por lo que podemos continuar y crear nuestro archivo de unidad.

sudo gedit /etc/systemd/system/htg.service

sudo gedit /etc/systemd/system/htg.service en una ventana de terminal

Se abrirá el editor gedit. Copie y pegue el siguiente texto en el editor:

[Unit]
Description=kirukiru.es Service Example

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Guarde sus cambios y cierre el editor.

archivo de unidad htg.service en el editor gedit

Las entradas tienen estos significados. Estas son entradas típicas. Nuestro sencillo servicio no necesita la mayoría de ellos, pero incluirlos nos permite explicarlos.

Descripción: esta es una descripción de texto de su servicio.
Quiere: nuestro servicio quiere, pero no requiere, que la red esté activa antes de que se inicie nuestro servicio.
Después: una lista de nombres de unidades que deben iniciarse después de que este servicio se haya iniciado con éxito, si aún no se están ejecutando.
Tipo: Simple. systemd considerará que este servicio se inició tan pronto como se haya bifurcado el proceso especificado por ExecStart.
ExecStart: la ruta al proceso que se debe iniciar.
Reiniciar: cuándo y si se debe reiniciar el servicio. Lo hemos configurado en «en caso de falla».
RestartSec: cuánto tiempo esperar antes de intentar reiniciar el servicio. Este valor está en segundos.
KillMode: Define cómo systemd debe matar el proceso si le pedimos a systemctl que detenga el servicio. Tenemos esto configurado para «procesar». Esto hace que systemd use la señal SIGTERM solo en el proceso principal. Si nuestro servicio fuera un programa no trivial en lugar de un script simple, lo configuraríamos como «mixto» para asegurarnos de que todos los procesos generados también terminaron.
WantedBy: Tenemos este conjunto en “multi-user.target”, lo que significa que el servicio debe iniciarse siempre que el sistema esté en un estado en el que varios usuarios puedan iniciar sesión, esté o no disponible una interfaz gráfica de usuario.

  Cómo acceder a su unidad pCloud en Linux

No es necesario que el archivo de la unidad sea ejecutable, pero los permisos del archivo de la unidad deberían restringir quién puede editarlo. No desea que un usuario malintencionado o malicioso cambie el archivo de la unidad para que ejecute un programa completamente diferente.

Este comando le dará al propietario permisos de lectura y escritura, y permisos de lectura al grupo. Otros no tendrán permisos.

sudo chmod 640 /etc/systemd/system/htg.service

sudo chmod 640 /etc/systemd/system/htg.service en una ventana de terminal

Podemos hacer que systemctl verifique la sintaxis de nuestro archivo de unidad por nosotros, incluso si el servicio aún no se está ejecutando. Se informará de cualquier error. (En realidad, la parte «.service» es opcional para la mayoría de los comandos).

systemctl status htg.service

systemctl status htg.service en una ventana de terminal

No se resaltan los errores, lo que significa que nuestro archivo de unidad es sintácticamente correcto.

Iniciar el servicio

Cuando agrega un nuevo archivo de unidad o edita uno existente, debe decirle a systemd que vuelva a cargar las definiciones del archivo de unidad.

sudo systemctl daemon-reload

Si desea que se inicie un servicio al inicio, debe habilitarlo:

sudo systemctl enable htg

Habilitar un servicio no lo inicia, solo lo configura para que se inicie en el momento del arranque. Para iniciar el servicio ahora, debe usar systemctl con la opción de inicio.

sudo systemctl start htg

sudo systemctl daemon-reload en una ventana de terminal

Verificando el Servicio

Después de iniciar manualmente el servicio o después de reiniciar la computadora, podemos verificar que nuestro servicio esté funcionando correctamente.

sudo systemctl status htg.service

sudo systemctl status htg.service en una ventana de terminal

Se nos muestra el estado del servicio.

  Cómo desinstalar software en Ubuntu Linux

Estado de htg.service en una terminal widnow

El punto verde significa que nuestro servicio está funcionando sin problemas.
El nombre del servicio es «htg.service», y la descripción larga es la que proporcionamos en el archivo de unidad.
Se nos muestra qué archivo de unidad se ha cargado «/etc/systemd/system/htg.service».
El servicio está activo y se indica la hora en que se lanzó.
Su PID es 7762.
Hay dos tareas asociadas con el servicio.
Un total de 928 Kibibytes de memoria están siendo utilizados por el servicio.
El grupo de control incluye el script «htg.sh» y el comando de suspensión, que ha sido lanzado por «htg.sh». La mayoría de las veces, el comando de suspensión hará el trabajo para este servicio.

También se muestran las últimas 10 entradas de diario producidas por este servicio. Como era de esperar, todos están separados por un minuto.

Detención y desactivación del servicio

Si necesita detener el servicio, puede hacerlo con este comando:

sudo systemctl stop htg.service

sudo systemctl detiene htg.service en una ventana de terminal

Esto detiene el servicio, pero no evita que se reinicie la próxima vez que se reinicie la computadora. Para detener el inicio del servicio en el inicio, debe deshabilitarlo:

sudo systemctl disable htg.service

sudo systemtctl deshabilita htg.service en una ventana de terminal

Si el servicio se está ejecutando, este comando no lo detiene. Simplemente le dice a systemd que no inicie el servicio en el próximo reinicio.

Si desea detener el servicio y evitar que se inicie durante el inicio, utilice ambos comandos.

Consejo de servicio

Asegúrese de que su programa se ejecute como se esperaba antes de intentar ejecutarlo como servicio.