systemd
de hoy lee su configuración de inicialización para cada daemon de una colección de archivos de unidad , que a menudo se denominan simplemente unidades . Con unidades de ruta , puede monitorear archivos y directorios para ciertos eventos. Si ocurre un evento específico, una unidad de servicio se ejecuta, y por lo general lleva el mismo nombre que la unidad de ruta. Mostraré cómo funciona esto con un ejemplo simple.
Supongamos que nos gustaría monitorear un archivo. Cada vez que el archivo se cierra después de una escritura, debe iniciarse un script específico.
La unidad de ruta:ejemplo.path
En el directorio /etc/systemd/system/
creamos el archivo example.path
con el siguiente contenido:
[Unit]
Description=Monitor the file for changes
[Path]
PathChanged=/home/john/testfile
Unit=example.service
[Install]
WantedBy=multi-user.target
En el [Path]
sección, PathChanged=
especifica la ruta absoluta al archivo a monitorear, mientras que Unit=
indica qué unidad de servicio ejecutar si el archivo cambia. Esta unidad (example.path
) debe iniciarse cuando el sistema está en modo multiusuario.
A continuación, creamos la unidad de servicio correspondiente example.service
en /etc/systemd/system/
.
La unidad de servicio:example.service
Si el archivo testfile
cambios (lo que significa que se escribe y se cierra), se llamará a la siguiente unidad de servicio para ejecutar el script especificado:
[Unit]
Description=Executes script when a file has changed.
[Service]
Type=simple
ExecStart=/home/john/script.sh
[Install]
WantedBy=multi-user.target
En este ejemplo, el archivo script.sh
contiene solo el siguiente código:
#!/bin/bash
echo "file changed" >/home/john/output.txt
Para probar la unidad de ruta, ambas unidades nuevas deben estar activadas, así que ejecute:
$ sudo systemctl enable example.{path,service}
$ sudo systemctl start example.path
Si ahora vuelve a escribir, o escribe en, el archivo testfile
, se ejecuta la unidad de servicio correspondiente y el archivo output.txt
se crea en el usuario john
directorio de inicio de.
La siguiente lista incompleta y no exhaustiva ofrece algunos ejemplos en los que las unidades de ruta podrían facilitar un poco su Día del administrador del sistema:
- Iniciar el procesamiento de datos basado en eventos.
- Supervise los archivos en
/etc
y enviar una notificación cuando se produzcan cambios. - Supervise la
import
carpeta para archivos nuevos y comenzar a procesar.
Cosas a tener en cuenta
Durante mis pruebas con unidades de ruta, noté que no todos los eventos se capturan bajo ciertas circunstancias. Por ejemplo, configure una unidad de ruta para monitorear cambios en una ruta y luego ejecute el siguiente comando:
$ touch /path/file && rm /path/file
Esperaría que la unidad de servicio se ejecutara dos veces, aquí:la primera vez para el touch
comando, y la segunda vez para el rm
dominio. Presenté un informe de Bugzilla para ver si este problema se debe al diseño o a un error que se puede solucionar.
Fuentes y enlaces relacionados
Si desea obtener más información sobre systemd
unidades, incluidas las unidades de ruta y servicio, eche un vistazo a las siguientes páginas man:
- systemd.unidad (5)
- systemd.ruta (5)
- systemd.servicio (5)
Además, si está interesado en los resultados de mi informe de error, puede seguirlo aquí:
Error 1722627:la unidad de ruta no detecta todos los eventos