Introducción

Hoxe imos ver como engadir tarefas a systemd. Xa que preciso executar un comando cando se vaia a apagar o equipo. De xeito que antes de pechar a sesión, finalice a execución dos contenedores do proxecto auto hospedado en docker.

Quero evitar que a próxima vez que arranque o equipo, os contenedores se poñan automáticamente en marcha. Xa que o disco no que está todo configurado non se vai montar automáticamente, ao ser un disco cifrado e non quero ter a clave de cifrado por aí escrita.

Tamén podería utilizar cron para a tarefa, pero xa que dispoño de systemd que é unha ferramenta máis moderna e que confire máis flexibilidade ao traballar con tarefas, vou utilizar isto.

Systemd é un conxunto de ferramentas, que entre outras cousas permite configurar e administrar tarefas do sistema, como por exemplo, executar un comando cada vez que se vaia a apagar o equipo. Ou executar comandos en momentos precisos no tempo, ou por periodos de tempo.

Engadir unha tarefa a systemd

Para engadir unha tarefa a systemd, precisamos crear dous ficheiros. Un ficheiro de servicio e un ficheiro de tempo. No ficheiro de servicio, engadimos as tarefas que queremos executar. Neste caso, engadimos unha tarefa que se executa cada vez que se vaia a apagar o equipo.

Ficheiro de servizo

O seguinte sería o noso ficheiro de servicio, por exemplo disconnect-self-hosted.service:

[Unit]
Description=Disconnect self-hosted services
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/home/user/scripts/turn-off-self-hosted.sh
[Install]
WantedBy=multi-user.target

Aquí o que precisamos configurar é:

  • Unha descripción para o ficheiro de configuración.
  • DefaultDependencies=no. Indica que non se executan dependencias por defecto.
  • Before=shutdown.target reboot.target halt.target. Indica que se executa antes de que se vaia a apagar ou reiniciar o equipo.
  • Un tipo de servicio, neste caso, oneshot. One shot significa que se executa unha unica vez.
  • RemainAfterExit=true indica que o ficheiro de servicio se executa en todos os casos. Esta liña é necesaria cando non hai un ExecStart.
  • ExecStop=script.sh indica o script que se executa.
  • WantedBy=multi-user.target indica que o ficheiro de servicio se executa en todos os usuarios.

O ficheiro estaría ubicado en /etc/systemd/system/disconnect-self-hosted.service.

Ficheiro de tempo

Aquí non precisamos crear un ficheiro de tempo, xa que a tarefa se executará sempre que se vaia a apagar o equipo. Independentemente da hora.

Exemplo con programación no tempo

Vexamos outro exemplo que si precise de ambos ficheiros. Digamos que queremos un servizo que nos actualice unha caché, descargando os datos dende algún lado. Para isto xa temos configurado un script que dará inicio a importación. Este script estará na nosa home e chamarase update-cache.sh. Pois o ficheiro de servizo, update-cache.service, sería:

[Unit]
Description=Run update-cache.service every hour

[Service]
Type=Oneshot
ExecStart=/home/user/scripts/update-cache.sh

[Install]
WantedBy=multi-user.target

A configuración é prácticamente a mesma ca antes, unicamente cambia que agora en troques de ExecStop temos ExecStart.

E o ficheiro para programar cando se executará a tarefa, update-cache.timer, será:

[Unit]
Description=Run update-cache.service every hour

[Timer]
OnCalendar=hourly

[Install]
WantedBy=timers.target

A explicación de cada liña é aseguinte:

  • Unha descripción para o ficheiro de configuración.
  • OnCalendar=hourly. Indica que se executa cada hora.
  • WantedBy=timers.target. Indica que se executa en todos os ficheiros de tempo.

A parte que é máis importante neste ficheiro sería o OnCalendar=hourly. Xa que se queremos mudar a periodicidade, deberemos mudar este valor. Os posibles valores que pode tomar son: minutely, hourly, daily, weekly, monthly, yearly, etc. Pero esta sería unha forma ríxida de traballar. Polo que tamén admite un formato igual ao dos cronjobs. Nos que podemos indicar un momento concreto de execución, ou unha periodicidade. Se por exemplo quixésemos que se executase cada hora impar aos trinta minutos, poríamos OnCalendar=*:1/2:30

Podemos ver exemplos dos valores tipo cron no artigo de cómo controlar a temperatura con bash e telegram

Remate

Unha vez engadimos os ficheiros que queremos, precisamos activar a tarefa. Dicirlle a systemd que a inclúa nas tarefas que ten que lanzar. Para isto executamos systemctl daemon-reload e systemctl enable yourservice --now. Con isto, en canto se cumpran as condicións indicadas, a tarefa será executada.

Conclusión

Engadir tarefas a systemd pode ser un pouco máis complexo que facelo no cron. Pero é unha ferramenta que nos ofrece máis flexibilidade e unha maneira de administrar tarefas do sistema.

Ao igual que no artigo anterior, son da opinión de que compre explorar as ferramentas máis modernas, para ver se nos conveñen máis no seu uso.

Cando leve un tempo con ela, poderei decidir se o que aporta fai que me decida a reemprazar cron.

Bibliografía