Avvia / arresta un systemd.service in orari specifici


14

Voglio avviare e arrestare un servizio systemd. In momenti specifici. Presumibilmente userò un'unità .timer per avviare il lavoro, ma esiste un modo integrato per interrompere il lavoro dopo una durata specifica o in un momento specifico , oppure devo creare una seconda unità .timer che esegue il stop?

Grazie

Risposte:


6

Per interrompere un servizio A con un timer, è possibile creare un servizio B di tipo con oneshotcui sarà in conflitto , quindi utilizzare un timer per avviare il servizio B.

Se un'unità ha un'impostazione Conflitti = su un'altra unità, l'avvio della prima interromperà la seconda e viceversa. ( fonte )

Un servizio:

[Unit]
Conflicts=B.service
...

B.Service:

[Unit]
Description=B service description

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

B.timer:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Quanto segue interromperà il servizio A dopo 10 secondi.

systemctl start A.service
systemctl start B.timer

2

Esiste davvero un altro modo per interrompere un servizio dopo un certo runtime configurato nel .servicefile.

RuntimeMaxSec=...

Potrebbe non piacerti il ​​fatto che il servizio sia considerato fallito, ma questo è un risultato più o meno logico dell'uccisione di un servizio di lunga durata.

Per ottenere una risposta migliore, potresti voler spiegare la tua logica per utilizzare una funzionalità così insolita. I servizi sono generalmente pensati per funzionare per sempre o fino a quando non vengono esplicitamente interrotti, non solo per un periodo di tempo fisso.


1
Sì, abbiamo discusso di questo e dei suoi limiti sulla mailing list: lists.freedesktop.org/archives/systemd-devel/2016-Aprile/…
Jamie Kitson,

1
Non insolito. Che dire dell'esecuzione di un servizio che richiede risorse, forse SETI, solo di notte, quando il server riceve meno traffico. Inoltre, dove lavoro, abbiamo un demone di avviso progettato per riattivare il team di supporto tramite i loro telefoni quando c'è un'eccezione sui server. Non vogliamo davvero che quella cosa fastidiosa funzioni quando siamo effettivamente svegli perché quei server hanno problemi a destra e sinistra durante il picco di utilizzo.
James M. Lay

0

È possibile utilizzare un paio di lavori cron:

 # ┌───────────── min (0 - 59) 
 # │ ┌────────────── hour (0-23)
 # │ │ ┌─────────────── giorno del mese (1-31)
 # │ │ │ ┌──────────────── mese (1 - 12)
 # │ │ │ │ ┌────────────────── giorno della settimana (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl avvia $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Maggiori informazioni su cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron


8
In che modo un cron job è un miglioramento rispetto alle .timerunità systemd che OP già conosce?
Pavel Šimerda,

Potrei, sì, ma la mia domanda è davvero come farlo correttamente con systemd? Presumo che ci debba essere un modo standard per far arrestare un lavoro in un momento specifico o dopo una certa durata.
Jamie Kitson,

@JamieKitson Ad essere onesti non credo che in realtà ci deve essere una tale funzione al di là di cron e timer systemd. La maggior parte dell'installazione di systemd non utilizzerà mai tali funzionalità e non c'è niente di sbagliato nell'esecuzione systemctlcon cron, systemd timer e qualunque cosa ti piaccia. Secondo me questa risposta è valida come qualsiasi altra risposta.
Pavel Šimerda,

come si consente ad esempio a www-data di eseguire systemctl start & stop?
alvaropgl,

@alvaropgl Il tuo commento non ha nulla a che fare con gli utenti (dati www) e quale accesso limitato possono avere per eseguire / non eseguire processi (systemctl), che è l'argomento. Si prega di iniziare un nuovo argomento. Suggerimento: probabilmente vorrai cercare di creare un'API per fare le cose che desideri, piuttosto che il tuo attuale approccio per abilitare più responsabilità + ambito sull'utente www-data.
Scott Prive,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.