Esegui lo script ogni 30 minuti con systemd


20

Vorrei eseguire uno script ogni 30 minuti dopo l'avvio nel sistema. So che puoi usare cron, ma non ho intenzione di utilizzare questa funzione spesso, quindi mi piacerebbe provarlo con systemd.

Finora ho trovato solo i timer monotonici che permettono di eseguire qualcosa una volta (almeno penso di sì). Come sarebbe il foo.timere foo@user.serviceaspetto come nel caso ho voluto eseguire qualcosa ogni 30 minuti dall'inizio di avvio / sistema?

foo@user.service

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???

Risposte:


26

Devi creare due file: uno per il servizio, l'altro per il timer con lo stesso nome.

esempio:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

successivamente ricaricare il sistema usando il comando systemctl daemon-reloade avviare il timer systemctl start test.timero abilitarlo di default.

prova il contenuto di 1.sh

#!/bin/bash
echo `date` >> /tmp/2

E comando per controllare tutti i timer disponibili: systemctl list-timers --all

Informazioni più dettagliate sulla pagina del progetto ed esempi sulla pagina ArchLinux


systemd accetta gli script ed è elencato, tuttavia non sta succedendo nulla
TomTom,

quale? ci dovrebbero essere due script, un timer e un altro servizio. Il tempo, quando sono stati eseguiti, può essere verificato dal comando list-timer, I possibili errori possono essere controllati da systemctl status test.timere systemctl status test.servicecomamand
Reishin

1
si prega di utilizzare il systemctl list-timers --allcomando e controllare l'output. Ha bisogno di essere come questo . Osserva le colonne unitarie, a sinistra e passate. Se è presente il timer, consultare il file di servizio e verificare la presenza di bug poiché il timer funziona normalmente.
Reishin,

1
no, la domanda principale di Coz non fa nulla riguardo a "notifica-invia" e penso che non dovremmo mescolare due cose diverse quando tale argomento è già presente. nel tuo caso, prova ad aggiungere export DISPLAY=:0.0allo script.
Reishin,

1
ps: secondo man systemd.timer il Persistent = true ha solo un effetto su configurato con OnCalendar (cioè wallclock)
snyh,

11

Ecco un'altra opzione senza usare il timer. Se il tempismo non è tremendamente critico e lo script non funziona a lungo, andrà bene per cose semplici.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh

2
Mi piace questa soluzione. L'unico svantaggio principale è che i log di sistema saranno inondati di log "Avvio <servizio X>" se si riavvia spesso (ovvero ogni 30 secondi). A quel punto potrebbe essere preferibile eseguire il servizio come demone, invece di riavviare il servizio più volte da systemd.
fagiolo jersey

È vero. Funziona in modo rapido e semplice. Ma il timer o uno script di lunga durata sarebbe una soluzione migliore.
Matt H
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.