Confusión del temporizador Systemd

Confusión del temporizador Systemd

Tengo un programa ejecutándose a través de Systemd y estoy tratando de descubrir cómo iniciarlo/detenerlo en determinados momentos. Es un programa persistente (transmisión).

Actualmente tengo un crontab con las siguientes líneas:

0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon

Estoy luchando por traducir esto a un archivo de temporizador Systemd.

Además, ¿es posible hacer que systemd (o cron) verifique si el servicio debería estar ejecutándose o no según la hora actual en caso de reiniciar?

Gracias por su ayuda. Si se ha preguntado esto antes, indíqueme ejemplos específicos de exactamente este tipo de cosas. La mayor parte de lo que puedo encontrar es cómo ejecutar un servicio en intervalos de 15 minutos y similares.

Respuesta1

Puede ser más sencillo tener un temporizador que ejecute un script una vez por hora y al reiniciar, y ese script verifique si la hora actual es la en la que el demonio debería estar ejecutándose o no, y luego, si es necesario (posiblemente después de una systemctl is-active $serviceverificación), se inicia. o detiene el servicio. Este script también podría buscar un archivo o actuar sobre otra lógica de negocios para determinar si las cosas deben estar ejecutándose o no, por ejemplo, un touch ~/.fooservice-do-not-runarchivo podría deshabilitar cosas o si la carga es demasiado alta, etc.

Respuesta2

Para iniciar servicios a través de temporizadores en systemd, utiliza dos archivos unitarios. AX.servicioarchivo para describir el servicio real, y unX.temporizadorarchivo para describir cuándo se debe iniciar el servicio.

Para activar y desactivar un servicio como lo describe, lo mejor que se me ocurre es tener un servicio separadoXoffpar de archivos unitarios, donde elservicioLos archivos entran en conflicto entre sí. ElXoffEl servicio realmente no hace nada, simplemente está ahí para “ejecutarse” cuando el servicio real está desactivado.

Para que te hagas una idea, aquí tienes un ejemplo de juguete con un servicio.dormirque se enciende cada minuto par y se apaga cada minuto impar.

servicio.de.dormir:

[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service

[Service]
ExecStart=/usr/bin/sleep 1d

tiempo de dormir:

[Unit]
Description=Timer to start the sleep service.

[Timer]
OnCalendar=*:0/2

servicio.sleepoff:

[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service

[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true

temporizador de apagado:

[Unit]
Description=Timer to stop the sleep service.

[Timer]
OnCalendar=*:1/2

información relacionada