¿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 procedimiento de creación de un servicio integrado, e inclusive 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 al iniciar 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 procedimiento 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 en realidad con cualquier otro programa que esté en su computadora.
Los programas que se lanzan al inicio están controlados por systemd
, los sistema y servicio gerente. systemd
es el primer procedimiento 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 procedimiento que systemd
ya ha comenzado.
Los programas que se ejecutan en segundo plano se denominan demonios o servicios. La «d» al final de systemd
significa daemon. En este post, 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 usando
systemctl
, los interfaz de control porsystemd
- Capaz de escribir en la revista
Creación del programa de servicio
Necesitamos tener un programa que systemd
pondrá en marcha. Crearemos un script simple, llamado «htg.sh». Este tutorial utiliza el editor de texto Gedit, pero puede utilizar el editor de texto que prefiera.
touch htg.sh
gedit htg.sh
los gedit
se abrirá el editor. 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.
El guión no hace mucho, pero hay algunos puntos que es importante destacar señalar.
- Los dos
echo
las líneas se canalizan a travéssystemd-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 el-p
Opción (prioridad) para indicar que nuestros mensajes son solo para información (info). No son errores ni advertencias importantes. - Hay un sin fin
while
círculo. - los
TIMESTAMP
La variable se establece en la fecha y hora actuales. Esto se formatea en un mensaje y se envía a la revista. - Después, el guión duerme durante 60 segundos.
- Después de 60 segundos, se repite el ciclo. Por eso, esta secuencia de comandos escribe un mensaje con marca de tiempo en el diario una vez por minuto.
Copiaremos el script al /usr/local/bin
directorio.
sudo cp htg.sh /usr/local/bin
Y necesitamos hacerlo ejecutable:
sudo chmod +x /usr/local/bin/htg.sh
Creación del archivo de unidad de servicio
Cada programa que se inicia por systemd
tiene un archivo de definición, llamado archivo de unidad de servicio. Esto tiene ciertos atributos que systemd
puede usar para localizar e iniciar el programa, y para establecer 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
Puede desplazarse por la lista de archivos de unidad, que está ordenada alfabéticamente, y chequear que no se utiliza el nombre que desea usar.
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
los gedit
se abrirá el editor. Copie y pegue el siguiente texto en el editor:
[Unit] Description=How-To Geek 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.
Las entradas disponen estos significados. Estas son entradas típicas. Nuestro sencillo servicio en realidad no necesita la mayoría de ellos, pero incluirlos nos posibilita explicarlos.
- Descripción: Esta es una descripción de texto de su servicio.
- Quiere: Nuestro servicio quiere, pero no necesita, que la red esté activada 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.
- Escribe: Sencillo.
systemd
considerará que este servicio se inició tan pronto como el procedimiento especificado porExecStart
se ha bifurcado. - ExecStart: El camino hacia el procedimiento que debe iniciarse.
- Reiniciar: Cuándo y si debe reiniciarse 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: Establece como
systemd
debería matar el procedimiento si preguntamossystemctl
para detener el servicio. Tenemos esto configurado para «procesar». Esto causasystemd
utilizar elSIGTERM
señal en el procedimiento principal solamente. 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 además terminaron. - Buscado por: Tenemos este ajuste 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.
No es necesario que el archivo de la unidad sea ejecutable, pero los permisos en el 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 distinto por completo.
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
Podemos tener systemctl
verifique la sintaxis de nuestro archivo de unidad por nosotros, inclusive 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
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 informar systemd
para volver a cargar las definiciones del archivo de la unidad.
sudo systemctl daemon-reload
Si desea que se lance un servicio al inicio, debe habilitar eso:
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, debes utilizar systemctl
con el start
opción.
sudo systemctl start htg
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
Se nos muestra el estado del servicio.
- 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 la 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
sleep
comando, que ha sido lanzado por «htg.sh». La mayor parte del tiempo,sleep
comando hará el trabajo para este servicio.
Además se muestran las últimas 10 entradas de diario producidas por este servicio. Como podíamos 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
Esto detiene el servicio, pero no evita que se reinicie la próxima vez que se reinicie la computadora. Para detener el lanzamiento del servicio al inicio, debe desactivar eso:
sudo systemctl disable htg.service
Si el servicio se está ejecutando, este comando no lo detiene. Simplemente dice systemd
para no iniciar el servicio en el próximo reinicio.
Si desea detener el servicio y evitar que se inicie a lo largo del inicio, utilice ambos comandos.
Consejo de servicio
Asegúrese de que su programa se ejecute como se esperaba antes de intentar ejecutarlo como servicio.