Pianificare l'esecuzione ad intervalli regolari di uno script.

Compilazione del kernel, gestione moduli, servizi attivi, e tutti gli interventi per l'ottimizzazione del sistema operativo.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2867
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da DoctorStrange »

Buonasera a tutti,

Devo realizzare uno script in bash che, ad intervalli regolari mandi in esecuzione uno specifico comando.
Benche l'aspetto tecnico, per quanto riguarda lo sviluppo dello script non mi crea problemi, c'è un aspetto che non so valutare, e per il quale chiedo lumi.
Il comando che deve andare in esecuzione, ogni venti secondi è questo:

Codice: Seleziona tutto

gcloud dataproc clusters list
Dove "gcloud" è un puntamento di sistema ad una utility che è parte della google SDK.
Questo script mi restituisce lo stato del cluster che ho in cloud e, in funzione di questo status, continua a sottomettere rochieste di tipo "start", e non appena sarà disponibile un'istanza con le specifiche che mi servono, la vvierà.
La domanda è: esiste qualche servizi di sistema, preposto a sottomettere una specifica richiesta dell'utente ad intervalli regolari? Sarei tentato di farlo inchiodando lo script in bash all'interno di un ciclo iterativo (for od if), ma non credo sia la soluzione migliore. Ho il sospetto che, se inchiodassi l'esecuzione in un ciclo if, questa potrebbe saturare rapidamente le risorse di sistema, con un'infinita serie di chiamate di sistema ravvicinate, e lo voglio evitare. Vorrei che lo script in bash si connetta all'istanza cloud, controlli che il cluster non sia già avviato e, se non lo è, sottometta una richiesta di avvio. Completato questo tas, dovrebbe poi uscire. Uscito, si ripete il ciclo, finche il cluster non è avviato, oppure continua l'esecuzione finche non lo arresto io manualmente, oppure arresto la macchina.

Se proprio non troverò altre soluzioni, proverò ad usare cron, ma per imparare anche tecniche nuove chiedo: trasformare il mio script in bash in un file di unit e poi avviarlo manualmente con

Codice: Seleziona tutto

sudo systemctl start mio servizio
sortirebbe il medesimo effetto?

In alternativa, tecniche piu elaborate, come l'impiego di pipe nominali (mkfifo), oppure staccando un thread?

Grazie mille.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4444
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da UbuNuovo »

Con systemd non sono pratico, aspetta altri interventi.
Con cron non puoi usare intervalli più brevi di un minuto.
Un ciclo con sleep funzionerebbe senza problemi, tipo:

Codice: Seleziona tutto

pausa=20 # 20 secondi
while :;do
    COMANDO
    sleep $pausa
done
Salva l'Ucraina! 🇺🇦
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2867
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da DoctorStrange »

Ti ringrazio per l'intervento ma, al momento ho preferito usare systemd-timers.
Lo script è questo:

Codice: Seleziona tutto

#!/bin/bash

pathDataprocSchedulerLog="/home/leonardochiodi1/MioArchivio/Programmi/Schedule-dataproc-continuous-restart-request/Start-log-dataproc-scheduler.txt";

#gcloud config set dataproc/region europe-north1

gcloudExecutable=$(update-alternatives --display gcloud |\
                                                 sed -n 2p |\
                                                 awk -F " " '{print $0}' |\
                                                 awk -F " " '{print $5}');

echo "gcloudExecutable: " $gcloudExecutable;

gcloudDataprocRegion=$($gcloudExecutable config get dataproc/region);

echo "gcloudDataproc region: " $gcloudDataprocRegion;

if [ !$gcloudDataprocRegion == "europe-north1" ]; then
        $gcloudExecutable config set dataproc/region europe-north1;
fi

gcloudDataprocStatus=$($gcloudExecutable dataproc clusters list |\
                                         sed -n 2p |\
                                         awk -F " " '{print $4}');

echo "gcloud cluster status: " $gcloudDataprocStatus;

if [ $gcloudDataprocStatus == "STOPPED" ]; then
        $gcloudExecutable dataproc clusters start cluster-spark;
        exitStatusAvvio=$?;
        date >> $pathDataprocSchedulerLog; 
fi

exit $exitStatusAvvio;
Ed i servizi di systemd sono questi:
cat /etc/systemd/system/ScheduleDataprocRequest.timer

Codice: Seleziona tutto

[Unit]
Description=Sottomette tramite Google SDK una richiesta ogni due minuti per avviare il mio cluster dataproc

[Timer]
OnUnitActiveSec=120s
OnBootSec=600s

[Install]
WantedBy=timers.target
E: cat /etc/systemd/system/ScheduleDataprocRequest.service

Codice: Seleziona tutto

[Unit]
Description=Sottomette tramite Google SDK una richiesta ogni due minuti per avviare il mio cluster dataproc

[Service]
Type=oneshot
ExecStart=/bin/bash /home/leonardochiodi1/MioArchivio/Programmi/Schedule-dataproc-continuous-restart-request/ScheduleDataproc.sh
Domanda; secondo voi la sintassi che ho usato per scrivere i servizi, è corretta?
Sembra che se io lancio lo script manualmente, funziona regolarmente.
anche il timer sembra funzionare correttamente, ecco uno snapshot:

Codice: Seleziona tutto

sudo systemctl status ScheduleDataprocRequest.timer
Che restituisce:

Codice: Seleziona tutto

● ScheduleDataprocRequest.timer - Sottomette tramite Google SDK una richiesta ogni due minuti per avviare il mio cluster dataproc
   Loaded: loaded (/etc/systemd/system/ScheduleDataprocRequest.timer; disabled; vendor preset: enabled)
   Active: active (waiting) since Wed 2023-04-12 08:06:19 UTC; 10min ago
  Trigger: Wed 2023-04-12 08:19:01 UTC; 1min 42s left

Apr 12 08:06:19 server-gcp-28-aprile-2021 systemd[1]: Started Sottomette tramite Google SDK una richiesta ogni due minuti per avviare il mio cluster dataproc
In particolare il Trigger funziona correttamente:
Trigger: Wed 2023-04-12 08:19:01 UTC; 1min 42s left

Però sembra non sortire alcun effetto.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4444
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da UbuNuovo »

La riga

Codice: Seleziona tutto

gcloudDataprocStatus=$($gcloudExecutable dataproc clusters list | sed -n 2p | awk -F " " '{print $4}');
la puoi semplificare, per ottenere il 4° campo della seconda riga, così:

Codice: Seleziona tutto

gcloudDataprocStatus=$($gcloudExecutable dataproc clusters list | awk 'NR==2 {print $4}');
Systemd devo ancora studiarlo a modo, vedrai che qualcuno interviene.
Salva l'Ucraina! 🇺🇦
Avatar utente
Filoteo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1322
Iscrizione: venerdì 28 agosto 2015, 9:38
Desktop: Gnome
Distribuzione: Arch Linux

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da Filoteo »

OnBootSec=600s avvia il servizio anche 10 minuti dopo l'avvio ma se ti interessa solo ogni 2 minuti, OnUnitActiveSec=120s è sufficiente. Il timer devi inoltre abilitarlo e avviarlo (avviare il timer non avvia il servizio):
sudo systemctl enable --now ScheduleDataprocRequest.timer. Verifica che lo script si avvii consultando i messaggi del journal: journalctl -t ScheduleDataprocRequest
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2867
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da DoctorStrange »

UbuNuovo ha scritto:
la puoi semplificare, per ottenere il 4° campo della seconda riga, così:

Codice: Seleziona tutto

gcloudDataprocStatus=$($gcloudExecutable dataproc clusters list | awk 'NR==2 {print $4}');
Provvederò. Grazie.
Filoteo ha scritto: OnBootSec=600s avvia il servizio anche 10 minuti dopo l'avvio ma se ti interessa solo ogni 2 minuti, OnUnitActiveSec=120s è sufficiente.
Ho inserito l'attesa dopo l'avvio per estinguere eventuali processi o servizi ancora in fase di avvio. Non è strettamente necessario ma, visto che questo mio servizio ha priorità bassissima, non voglio rischiare che incida sull'avvio di qualche servizio di sistema piu importante.
Filoteo ha scritto: Il timer devi inoltre abilitarlo e avviarlo (avviare il timer non avvia il servizio):
sudo systemctl enable --now ScheduleDataprocRequest.timer. Verifica che lo script si avvii consultando i messaggi del journal: journalctl -t ScheduleDataprocRequest
Ora provvedo, ma la domanda: dare un "systemctl enable", non include il mio servizio nella lista dei servizi che vengono avviati automaticamente ad ogni avvio?
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4444
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da UbuNuovo »

non avevo visto:

Codice: Seleziona tutto

gcloudExecutable=$(update-alternatives --display gcloud | sed -n 2p | awk -F " " '{print $0}' | awk -F " " '{print $5}');
che si può semplificare allo stesso modo:

Codice: Seleziona tutto

gcloudExecutable=$(update-alternatives --display gcloud | awk 'NR==2 {print $5}');
Salva l'Ucraina! 🇺🇦
Avatar utente
Filoteo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1322
Iscrizione: venerdì 28 agosto 2015, 9:38
Desktop: Gnome
Distribuzione: Arch Linux

Re: Pianificare l'esecuzione ad intervalli regolari di uno script.

Messaggio da Filoteo »

DoctorStrange ha scritto:
mercoledì 12 aprile 2023, 11:11
dare un "systemctl enable", non include il mio servizio nella lista dei servizi che vengono avviati automaticamente ad ogni avvio?

Sì, se abiliti il .service, ma vuoi abilitare il .timer.
Scrivi risposta

Ritorna a “Kernel e servizi di sistema”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 8 ospiti