Iniciar / detener un systemd.service en momentos específicos

14

Quiero iniciar y detener un systemd.service en momentos específicos. Presumiblemente usaré una unidad .timer para comenzar el trabajo, pero ¿hay alguna forma integrada de detener el trabajo después de una duración específica, o en un momento específico , o tengo que crear una segunda unidad .timer que ejecute el stop?

Gracias

Jamie Kitson
fuente

Respuestas:

6

Para detener un servicio A con un temporizador, puede crear un servicio B del tipo con el oneshotque entrará en conflicto y luego usar un temporizador para iniciar el servicio B.

Si una unidad tiene una configuración Conflictos = en otra unidad, al iniciar la primera se detendrá la segunda y viceversa. ( fuente )

Un servicio:

[Unit]
Conflicts=B.service
...

B. servicio:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''

B. temporizador:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Lo siguiente detendrá el servicio A después de 10 segundos.

systemctl start A.service
systemctl start B.timer
Radivarig
fuente
2

De hecho, hay otra forma de detener un servicio después de cierto tiempo de ejecución configurado en el .servicearchivo.

RuntimeMaxSec=...

Es posible que no le guste el hecho de que el servicio se considera fallido, pero ese es un resultado más o menos lógico de matar un servicio de larga duración.

Para obtener una mejor respuesta, es posible que desee explicar su justificación para usar una característica tan inusual. Los servicios generalmente están destinados a ejecutarse para siempre o hasta que se detengan explícitamente, no solo por un período fijo de tiempo.

Pavel Šimerda
fuente
1
Sí, discutimos esto y sus limitaciones en la lista de correo: lists.freedesktop.org/archives/systemd-devel/2016-April/…
Jamie Kitson
1
No inusual. ¿Qué pasa con la ejecución de un servicio que requiere recursos, tal vez SETI, solo por la noche, cuando el servidor recibe el menor tráfico? Además, donde trabajo, tenemos un demonio de alerta diseñado para despertar al equipo de soporte a través de sus teléfonos cuando hay una excepción en los servidores. Realmente no queremos que se ejecute esa cosa molesta cuando estamos realmente despiertos porque esos servidores tienen problemas de izquierda a derecha durante el uso pico.
James M. Lay
0

Podría usar un par de trabajos cron:

 # ┌───────────── min (0-59) 
 # │ ┌────────────── hora (0-23)
 # │ │ ┌─────────────── día del mes (1 - 31)
 # │ │ │ ┌──────────────── mes (1 - 12)
 # │ │ │ │ ┌───────────────── día de la semana (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl start $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Más información sobre cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron

John Moon
fuente
8
¿Cómo es un trabajo cron una mejora sobre las .timerunidades systemd que OP ya conoce?
Pavel Šimerda
Podría, sí, pero mi pregunta realmente es ¿cómo hacer esto correctamente con systemd? Supongo que debe haber alguna forma estándar de hacer que un trabajo se detenga en un momento específico o después de una cierta duración.
Jamie Kitson
@JamieKitson Para ser honesto, no creo que realmente deba existir una función más allá de los temporizadores cron y systemd. La mayoría de las instalaciones de systemd nunca usarán tales funciones y no hay nada de malo en ejecutar systemctlusando cron, temporizadores systemd y lo que quiera. En mi opinión, esta respuesta es tan válida como cualquier otra respuesta.
Pavel Šimerda
¿Cómo permite, por ejemplo, a www-data ejecutar systemctl start & stop?
alvaropgl
@alvaropgl Su comentario no tiene nada que ver con los usuarios (www-data) y qué acceso limitado pueden tener para ejecutar / no ejecutar procesos (systemctl), que es el tema. Por favor, inicie un nuevo tema. Sugerencia: probablemente desee considerar hacer una API para hacer las cosas que desea, en lugar de su enfoque actual de permitir más responsabilidad + alcance en el usuario de www-data.
Scott Prive