Re: lanciare un programma dopo che il primo è partito

2025-03-06 Per discussione Leonardo Boselli

On Thu, 6 Mar 2025, Gerlos wrote:
- ho una serie di script che vengono lanciati da at (ma potrebbe essere 
anche crontab, da console o da qualunque altro programma) a orari definiti;


La butto là, un po' rapidamente perché sono di fretta: perché non sfruttare 
il fatto che systemd è in grado di avviare servizi utente (systemctl --user) 
a orari definiti, e che ci sono degli automatismi (come "Wants=", "Require=" 
e "After=") che permettono di impostare relazioni di dipendenza tra i 
servizi?


in parte sono a orari definiti, ma possono essere fatti partire e fermati 
in qualsiasi momento e non c'è nessuna sequenza particolare, le varie 
applicazioni che possono essere sulla stessa porta hanno la stessa 
interfaccia ma fanno funzioni leggermente diverse (per questo se già c'è 
una applicazione che gira, la nuova manda i comandi a questa, ma non si 
installa - immaginale come driver di stampa, che accettano gli stessi 
comandi ma sono ottimizzati per ciascuna periferica).
[proprio perché sono dei driver di periferica, che hanno funzioni 
leggermente diverse a seconda del momento e di cosa c'è attaccato]

--
Leonardo Boselli
Firenze, Toscana, Europa
http://i.trail.it
tel:+393287329225

lanciare un programma dopo che il primo è partito

2025-03-06 Per discussione Leonardo Boselli

Sembra facile ma:
- ho una serie di script che vengono lanciati da at (ma potrebbe essere 
anche crontab, da console o da qualunque altro programma) a orari 
definiti;

- questi script debbono venir lanciati con comandi del tipo:
 ~/Script/scriptname -p n -i ./ScriptParam/parametri
   dove n è un numero di porta su cui viena fatto partire un server 
http su localhost:n e ./scriptParam/parametri00 è un file che contiene 
i parametri (sotto forma di chiamate GET da inviare al server)

- in alternativa esiste la chiamata
 ~/Script/sempreloostessonome -p n -k ./scriptParam/parametri99

Lo script deve controllare se la porta n è già "occupata" da un 
processo in ascolto: se la porta è occupata allora invia una serie di 
richieste al processo in ascolto [qualunque sia]; se invece la porta è 
libera fa partire il processo server e quando questo è partito inviargli 
io comandi.
Da qui le due domande: come controllo se la porta è già in uso e quindi 
mando direttamente i comandi con curl ?
come faccio in maniera elegante a sapere che il programma è partito ? mi 
viene in mente una linea

 ./script/progname -...(i parametri e i comandi).. & ; sleep 5
c'è qualcosa di più pulito ?

(mi è venuta in mente anche la idea sporca di fare comunque partire 
progname, e si mi ritorna address already in use ignoralo e andare avanti. 
il problema è che applicazioni diverse noin ritornano sempre lo stesso 
error code, e potrebbero darmi errori di tipo diverso, che non vorrei 
perdere)




--
Leonardo Boselli
Firenze, Toscana, Europa

Re: lanciare un programma dopo che il primo è partito

2025-03-06 Per discussione Diego Zuccato

Il 06/03/2025 19:56, Leonardo Boselli ha scritto:

Da qui le due domande: come controllo se la porta è già in uso e quindi 
mando direttamente i comandi con curl ?

Con lsof puoi vederlo senza particolari problemi:
  lsof -iTCP -sTCP:LISTEN -P -n|grep $porta
oppure
  lsof -iTCP -iTCP:$porta -sTCP:LISTEN


come faccio in maniera elegante a sapere che il programma è partito ?
Dipende dalla definizione di "partito": lanciato, pronto in ascolto, ha 
già fatto qualcosa... ?


Molti programmi prevedono anche un flag file dove scrivono il loro PID. 
Potrebbe esserti utile.


--
Diego Zuccato
DIFA - Dip. di Fisica e Astronomia
Servizi Informatici
Alma Mater Studiorum - Università di Bologna
V.le Berti-Pichat 6/2 - 40127 Bologna - Italy
tel.: +39 051 20 95786



Re: lanciare un programma dopo che il primo è partito

2025-03-06 Per discussione Leonardo Boselli

On Thu, 6 Mar 2025, Diego Zuccato wrote:
Da qui le due domande: come controllo se la porta è già in uso e quindi 
mando direttamente i comandi con curl ?

Con lsof puoi vederlo senza particolari problemi:
 lsof -iTCP -sTCP:LISTEN -P -n|grep $porta
oppure
 lsof -iTCP -iTCP:$porta -sTCP:LISTEN


lo vedo, ma come lo metto in un test [fra l'laltro deve controllare solo 
per [::1] perché su altri indirizzi, compreso 127.0.0.1, la porta potrebbe 
già essere in uso] .



come faccio in maniera elegante a sapere che il programma è partito ?
Dipende dalla definizione di "partito": lanciato, pronto in ascolto, ha già 
fatto qualcosa... ?


pronto in ascolto 

Molti programmi prevedono anche un flag file dove scrivono il loro PID. 
Potrebbe esserti utile.


non lo hanno [anche se potrei mettercelo, ma a quel punto tanto vale che 
crei dei file /var/run/localport18000...18012 però questo non mi tutela in 
caso di uscita anomala...


--
Leonardo Boselli
Firenze, Toscana, Europa

Re: lanciare un programma dopo che il primo è partito

2025-03-06 Per discussione Gerlos

Ciao,

Il 06/03/25 19:56, Leonardo Boselli ha scritto:

Sembra facile ma:
- ho una serie di script che vengono lanciati da at (ma potrebbe 
essere anche crontab, da console o da qualunque altro programma) a 
orari definiti;

- questi script debbono venir lanciati con comandi del tipo:
 ~/Script/scriptname -p n -i ./ScriptParam/parametri
   dove n è un numero di porta su cui viena fatto partire un 
server http su localhost:n e ./scriptParam/parametri00 è un file 
che contiene i parametri (sotto forma di chiamate GET da inviare al 
server)

- in alternativa esiste la chiamata
 ~/Script/sempreloostessonome -p n -k ./scriptParam/parametri99

Lo script deve controllare se la porta n è già "occupata" da un 
processo in ascolto: se la porta è occupata allora invia una serie di 
richieste al processo in ascolto [qualunque sia]; se invece la porta è 
libera fa partire il processo server e quando questo è partito 
inviargli io comandi.
Da qui le due domande: come controllo se la porta è già in uso e 
quindi mando direttamente i comandi con curl ?



La butto là, un po' rapidamente perché sono di fretta: perché non 
sfruttare il fatto che systemd è in grado di avviare servizi utente 
(systemctl --user) a orari definiti, e che ci sono degli automatismi 
(come "Wants=", "Require=" e "After=") che permettono di impostare 
relazioni di dipendenza tra i servizi?


Ad esempio, se la unit che avvia lo script A rileva che il servizio è 
pronto, con l'istruzione "After=" puoi dirgli di lanciare la unit che 
avvia lo script B.


Ora, se non hai mai pasticciato con systemd può sembrare complicato, e 
il fatto che con systemd si possa fare un sacco di roba confonde, ma per 
queste cose mi sembra l'approccio più facile e robusto.


saluti,
Gerlos