Skip to content

Ejecutar un bash script de fondo cada X segundos

Updated: at 17:03

Contenidos

Open Contenidos

Crear el bash script y configurarlo

Este ejemplo es para sincronizar mi carpeta notes alojada en un repositorio remoto de Github.

Script sync.sh

#!/bin/bash                                                                   
                                                                               
# Configura tu repositorio y rama                                             
REPO_DIR="/home/miguehm/.nb/notes"                                             
BRANCH="main"                                                                 
                                                                              
# Cambia al directorio del repositorio                                        
cd $REPO_DIR                                                                  
                                                                              
# Actualiza el repositorio local                                              
git pull origin $BRANCH                                                       
                                                                              
# Añade y comitea los cambios locales                                         
git add .                                                                     
git commit -m "Sincronización automática"                                     
                                                                              
# Intenta hacer push                                                          
git push origin $BRANCH                                                       
                                                                              
# Si el push falla, intenta hacer rebase                                      
if [ $? -ne 0 ]; then                                                         
    git pull --rebase origin $BRANCH                                          
    git push origin $BRANCH                                                   
fi

Darle permisos de ejecución

chmod +x sync.sh

Archivos service, timer y el sistema systemd

systemd es un sistema de inicialización y gestor de servicios para sistemas operativos basados en Linux. Utiliza archivos de configuración llamados units (.service, .timer, .sockets, etc.) para definir y gestionar servicios, temporizadores, sockets, dispositivos, y más.

Un service puede ser cualquier tipo de tarea que se ejecute en segundo plano, como un servidor web, un script o una aplicación.

Un timer configuran temporizadores que activan servicios en momentos específicos o a intervalos regulares. Son útiles para tareas programadas, como copias de seguridad, sincronización de archivos o cualquier tarea que necesite ejecutarse periódicamente.

.service define que se debe hacer, .timer define cuando se debe hacer.

Para nuestro caso particular, los archivos se guardaran en las siguiente ruta:

mkdir -p ~/.config/systemd/user/

Creando archivo service

[Unit]
Description=Run sync.sh for my notes

[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ExecStart=/home/miguehm/.scripts/sync.sh

[Install]
WantedBy=default.target

Se establece la directia Enviroment en [Service] para que el servicio encuentre git.

Creando archivo timer

[Unit]
Description=Run sync.sh for my notes every 30 seconds

[Timer]
OnBootSec=30s
OnUnitActiveSec=30s
Unit=sync-notes.service

[Install]
WantedBy=timers.target

Inicialización y puesta en marcha del servicio

systemctl es una herramienta de linea de comandos para controlar el estado de los servicios y otras unidades.

Recargar los archivos de systemd para tu usuario.

systemctl --user daemon-reload

Habilita y arranca el temporizador.

systemctl --user enable sync-notes.timer 
systemctl --user start sync-notes.timer

Asegúrate que el servicio de usuario systemd se inicie al arrancar.

sudo loginctl enable-linger $(whoami)

Verificar que las units se ejecutan correctamente

Para .service

systemctl --user status sync-notes.service

Para .timer

systemctl --user status sync-notes.timer

Ver los logs del sistema

Para ver los logs del servicio de usuario.

journalctl --user -u sync-notes.service

Ver los logs mas recientes y seguirlos en tiempo real.

journalctl --user -u sync-notes.service -f

Casos de uso

En mi situación particular, necesito sincronizar mis notas markdown con todos mis dispositivos (Laptop, PC de escritorio y teléfono) y poder utilizarlo en Obsidian y nb, mis principales aplicaciones de notas, por lo que un servicio ejecutándose de fondo resulta muy útil para mantener mi flujo de escritura.