Topic: Script coordinator  (Letto 297 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline vinny74

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Script coordinator
« il: Settembre 26, 2021, 09:41 »
Ciao a tutti, ho scritto diversi script in python che dialogano con un software di automazione, ogni script ha il suo compito e tutto va bene così, al momento tramite systemd (Uso ubuntu 18.04 LTS) li faccio partire tutti al boot ed eventualmente si restartano in caso di stop anomali, vorrei però creare un unico script in systemd che faccia partire lui tutti gli script, e li controlli, potete aiutarmi?

Grazie

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #1 il: Settembre 26, 2021, 11:39 »
Ciao collega pinguino (uso prevalentemente ubuntu 20.04, ma anche la 18, debian e qualcos'altro)

non ho ancora provato il system.d con python, al massimo lanciato script all'avvio utente, ma dato che non è questo il Tuo problema se posso cercherò di darti una mano, certo ci imparo qualcosa anch'io.

Domanda preliminare/indispensabile : Quale difficoltà hai a riunire i Tuoi vari script in una cartella ed utilizzarli come moduli richiamabili da un modulo "principale" di controllo?

Suggerimento/domanda forse utile : nel caso vari processi debbano agire contemporaneamente, hai presente i thread in python?

In fine : quale versione di python usi nei vari Tuoi script?

Offline vinny74

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #2 il: Settembre 28, 2021, 06:25 »
Utilizzo python 3.9, non ho provato ad accorpare gli script con python, ma volevo farlo tramite systemd, in modo che comunque ogni script fosse indipendente

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #3 il: Settembre 28, 2021, 07:47 »
Debbo dire che sono confuso, non comprendo cosa Tu voglia in realtà fare. Se devono essere "indipendenti" li lanci uno alla volta e finisce li, sarebbe "sufficiente".

Supposto, comunque, Tu voglia semplicemente "unificare" il lancio dei Tuoi script python, lasciandoli indipendenti tra loro, utilizza bash, fai un piccolo script in cui inserisci i comandi per ogni singolo script nell'ordine che vuoi avere e poi lanci quello con system.d

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Script coordinator
« Risposta #4 il: Settembre 28, 2021, 11:11 »
Non sono più aggiornato... hanno tolto cron da linux, ultimamente?

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #5 il: Settembre 28, 2021, 13:23 »
Cron continua ad esistere
NzP:~$ locate cron
/etc/anacrontab
/etc/cron.d
...

e lo OP dice che già li lancia all'avvio del sistema

... personalmente non sto capendo quale sia la reale problematica posta

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Script coordinator
« Risposta #6 il: Settembre 28, 2021, 18:54 »
ero ironico

Offline vinny74

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #7 il: Ottobre 02, 2021, 06:29 »
Non c'è nessune problema era solo che invece di farli partire indipendentemente (come già faccio) volevo farli partire da un unico programma che magari  controllasse pure lo stato degli altri, e magari facesse un unico log per tutti, in modo da andare a visualizzare in un unico posto eventuali problemi.

Ho provato a farlo in bash da systemd con "ExecPost" ma parte solo il primo script, gli altri restano in attesa.

Grazie

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #8 il: Ottobre 02, 2021, 19:43 »
Ho provato a farlo in bash da systemd con "ExecPost" ma parte solo il primo script, gli altri restano in attesa.

Se ho capito bene, hai cercato di lanciare da uno script bash i tuoi script python e lo script bash ti lancia il primo script e lascia gli altri in attesa, giusto?
Quello è il comportamento normale di bash se le istruzioni non vengono lanciate in background.
Ti faccio un esempio : sia example.py lo script che segue simulante un processo gestito con python:
import sys
from time import sleep

def start(name, iteration, interval):
    try:
        it = int(iteration)
        intv = float(interval)
    except ValueError:
        print('Parametri non validi.')
        exit()
    for i in range(it):
       sleep(intv)
       print(' - Processo %s : iterazione %d' % (name, i+1))
    print('Processo %s terminato.' % name)

if __name__ == '__main__':
    param = sys.argv[1:]
    if len(param) != 3:
        print('Utilizzo : python3 example.py name iteration interval')
        exit()
    print('Avvio processo %s' % param[0])
    start(*param)
    exit()


sia "starter.sh" uno script bash che lancia due distinti processi python, così definito:
#!/bin/bash

python3 example.py nuzzo 5 1.5
python3 example.py pippo 5 1

(che poi penso sia come Tu abbia definito i Tuoi script) con tale modalità bash lancerà il processo pippo DOPO la conclusione del processo nuzzo
NzP:~$ cd src/posts/vinny
NzP:~$ ./starter.sh
Avvio processo nuzzo
 - Processo nuzzo : iterazione 1
 - Processo nuzzo : iterazione 2
 - Processo nuzzo : iterazione 3
 - Processo nuzzo : iterazione 4
 - Processo nuzzo : iterazione 5
Processo nuzzo terminato.
Avvio processo pippo
 - Processo pippo : iterazione 1
 - Processo pippo : iterazione 2
 - Processo pippo : iterazione 3
 - Processo pippo : iterazione 4
 - Processo pippo : iterazione 5
Processo pippo terminato.
NzP:~$


Volendo far agire contestualmente i processi dovremmo eseguire le istruzioni in background, ciò si effettua aggiungendo "&" alla fine dell'istruzione da eseguire in background, lo script diverrebbe
#!/bin/bash

python3 example.py nuzzo 5 1.5 &
python3 example.py pippo 5 1 &

e l'output diverrebbe
NzP:~$ Avvio processo pippo
Avvio processo nuzzo
 - Processo pippo : iterazione 1
 - Processo nuzzo : iterazione 1
 - Processo pippo : iterazione 2
 - Processo pippo : iterazione 3
 - Processo nuzzo : iterazione 2
 - Processo pippo : iterazione 4
 - Processo nuzzo : iterazione 3
 - Processo pippo : iterazione 5
Processo pippo terminato.
 - Processo nuzzo : iterazione 4
 - Processo nuzzo : iterazione 5
Processo nuzzo terminato.

Quest'ultima modalità, però, presenta una difficoltà, dato che ogni singola istruzione in background viene eseguita in una sua shell, indipendente da quella dello script che la ha lanciata quindi il Tuo "unico programma che magari  controllasse pure lo stato degli altri" comincia ad avere qualche problema, se vuoi solo controllare che un processo sia attivo, ce la fai rilevando il PID del processo avviato e controllandolo ogni tanto ma far di più diventa ostico.
Tieni inoltre presente che systemctl permette di controllare lo stato dei processi avviati nel sistema ... non so quanto Ti convenga lanciare l'insieme di script in unica soluzione.

Per il log "unico" la soluzione è semplice : indirizza il log di tutti i Tuoi script sullo stesso file in modalità "append", e li avrai tutti assieme anche se li lanci separatamente.

Ciao :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Script coordinator
« Risposta #9 il: Ottobre 03, 2021, 12:29 »
però davvero, eh.
Mi spiegate perché cron non va bene?

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 480
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #10 il: Ottobre 04, 2021, 08:05 »
E perché non dovrebbe andare bene lo scheduler?

Però @vinny74 dice di aver chiare l'aspetto di avvio dei suoi script e non saprei se sia interessato a modalità di lancio alternative a quelle che già usa ... piuttosto, ho l'impressione che abbia qualche difficoltà sotto altri aspetti che, se vero, si presenterebbero in entrambe le modalità di avvio degli script, del che il mio precedente post.

Per altro, di per se l'argomento (avvio script python a start sistema e/o a momenti definiti) credo "sarebbe" interessante per utenti "amatoriali", che in genere non si trovano di fronte a tal genere di problematiche ... l'ultima volta che ne ho avuto bisogno io, tanti anni fa, vigeva ancora il vecchio SystemV e cron non è che mi sia mai servito molto ... non parliamo poi dei sistemi win.
Certo, bisognerebbe un po' vedere quando tali tecniche sarebbe utili per un proprio script ma andarsele a guardare non sarebbe male.

Offline vinny74

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Script coordinator
« Risposta #11 il: Ottobre 04, 2021, 18:48 »
Ciao di nuovo a tutti per quanto riguarda cron, non è ho bisogno ho già fatto gli script in systemd per l'avvio automatico al boot e systemd controlla pure un eventuale stop anomalo e quindi lo riavvia, gli script python al momento sono 3,  e questi non terminano mai, sono tutti script che controllano gli stati di alcuni GPIO del raspberry, quindi entrano in un loop e fanno il loro lavoro, perciò facendo uno script in bash sempre da systemd parte il primo questo non ritorna mai e quindi gli altri non partono, pensavo che facendolo in python fosse stato un pò più semplice, ma sembra di no, io posso già controllare lo stato di ogni singolo script con "systemctl status script.....", quello che mi piacerebbe era controllare tutti e 3 gli script da uno solo, ma da quello che ho capito non è semplicissimo ne in bash ne in python.
Grazie a tutti per l'interesse.

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.661
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Script coordinator
« Risposta #12 il: Ottobre 06, 2021, 17:09 »
Allora qua è un gatto che si morde la coda: vuoi avere script separati da gestire come se fossero un unico processo, che mi sembra un assurdo

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.198
  • Punti reputazione: 9
    • Mostra profilo
Re:Script coordinator
« Risposta #13 il: Ottobre 07, 2021, 12:58 »
Sì beh, qui mi sa che al gatto è venuto mal di schiena a forza di mordersi la coda.


Allora, ripartiamo daccapo.

Hai "diversi script". Bene.

Ciascuno di questi script, per ragioni sue, è bloccante. Se lo avvii, non si ferma mai. Nessun problema, succede.

Vuoi un "coso misterioso" che fa partire tutti questi script insieme, in un determinato momento. Benissimo.

Ora capisci che questo "coso misterioso", lui, di per sé, non può che essere un altro programma, ovvero un altro processo. Perché alla fine sempre di computer stiamo parlando. Potrebbe essere un bash script; in Windows avresti il classico script di powershell; se fossi un javista potresti usare Jenkins o qualsiasi altra corazzata che hanno da quelle parti; non riesco a credere che systemd non faccia quello che vuoi, ma qui c'è il fatto che systemd è il classico labirinto di complessità che piace tanto nel mondo unix, e io proprio non ho un cervello sufficientemente potente da capire queste cose; potresti usare cron, perché mi sa che è quello che fanno tutti; ovviamente puoi anche usare Python stesso, se credi.

Ma qualunque soluzione tu voglia usare, di base quello che stai facendo è: avere un "programma" che avvia diversi altri "programmi" separati. Ovvero, processi figli. E' ovvio che se tu ti limiti a dire "importa questo, avvialo"; poi "importa quello, avvialo"; eccetera, in modo lineare, allora banalmente il primo processo blocca tutto. Se volessi usare Python, per dire, la chiave sarebbe usare subprocess (o magari direttamente multiprocessing, visto che in fondo sono tutti script python? dovresti valutare).

Ora, puoi senz'altro farti un accrocchio Python che avvia diversi script (anche Python) con subprocess. Io credo che la cosa migliore sarebbe comunque rivolgersi a una soluzione già esistente, un po' più robusta, tipo http://supervisord.org/index.html (e credo che, se ci sono strumenti del sistema operativo che fanno queste cose, tanto vale usare quelli direttamente... ma qui i gusti sono gusti).