Come vedere se script python è in esecuzione

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns e altro.
Scrivi risposta
Avatar utente
omegaub
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 342
Iscrizione: martedì 2 dicembre 2008, 12:50
Desktop: gnome
Distribuzione: Ubuntu 18.04.4 LTS
Sesso: Femminile
Località: Boschi romani

Come vedere se script python è in esecuzione

Messaggio da omegaub »

Ciao a tutti!
Sto gestendo un server Ubuntu e degli script in python3 che girano su di esso, a volte avviati con il cron a volte avviati da sito web, come posso vedere da sistema operativo se quel determinato script è in esecuzione? E c'è un modo per vedere se è stato attivato dal cron o da sito web?
Grazi a tutti!

Mic
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 363
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: Come vedere se script python è in esecuzione

Messaggio da Lucio C »

Io uso questo comando per monitorare i miei processi in generale. Non so cosa faccia vedere se il processo e' "pitonico"

Codice: Seleziona tutto

ps -A -o ppid,pid,user,command --sort=ppid,pid,user !* | more
Il fatto di visualizzare e sortare il ppid (parent process id) dovrebbe aiutare a capire da chi il processo e' stato schedulato.
La man page di ps puo' suggerire altre opzioni al poato di "command" (comm, ucomm, args)
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
Clover
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 298
Iscrizione: giovedì 30 agosto 2012, 14:04
Desktop: KDE
Distribuzione: Kubuntu x86_64

Re: Come vedere se script python è in esecuzione

Messaggio da Clover »

Io invece cerco prima il binario del processo che mi interessa (notare la seconda colonna che è il PID e ti servirà successivamente):

Codice: Seleziona tutto

ps -aux | grep python
e poi vado a evidenziare il pid del processo che mi interessa nella visualizzazione ad albero (lo evidenzia in grassetto in mezzo a tutti i processi):

Codice: Seleziona tutto

sudo pstree -H <PID>
nota: al posto di <PID> devi mettere quello del processo che ti interessa
korda
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1703
Iscrizione: giovedì 24 dicembre 2020, 15:58

Re: Come vedere se script python è in esecuzione

Messaggio da korda »

Top, htop, btop... Qualsiasi task manager va bene: fanno già il tree. Per gli script specifici basta solo greppare
Io non sono Bagheera né Akela, io non frequento la Rupe.
Io sono Kaa: faccio ballare le scimmie alle Tane Fredde.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: Come vedere se script python è in esecuzione

Messaggio da DoctorStrange »

In quale contesto vengono eseguiti questi script python? Se usassi Spark od una delle applicazioni della suite Cloudera, potresti accedere alla consolle Hue e vedere esattamente quali processi sono pendenti, quale server lo ha lanciato ed anche una statistica inerente il congestionamento del server, o cluster dove il processo è in esecuzione.

Resta comunque il fatto che per killarlo, il metodo elettivo rimane quello che ti hanno già indicato. Accedi tramite consolle Bash e lo killi brutalmente con "kill -9".

Per il genere di lavoro che faccio, mi è capitato molto spesso che utenti lanciassero script in Python senza poi preoccuparsi di arrestarli o controllarli. Restavano appesi per delle ore in attesa che una tabella del DB diventasse disponibile e poi intervenivo io che li "brutalizzavo" :D .

Tutto questo per dire: se sviluppi questo genere di scriipt sarebbe utile che tui inserissi dei "kill switch", ovvero delle istruzioni che, trascorso uno specifico intervallo, se la risorsa richiesta non è disponibile, il processo concluda in maniera autonoma "gracefully", in gergo.

Ti ringrazieranno in molti :p
Avatar utente
omegaub
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 342
Iscrizione: martedì 2 dicembre 2008, 12:50
Desktop: gnome
Distribuzione: Ubuntu 18.04.4 LTS
Sesso: Femminile
Località: Boschi romani

Re: Come vedere se script python è in esecuzione

Messaggio da omegaub »

Grazie a tutti per le risposte, le ho provate tutte ma non mi hanno aiutata. Ho avviato lo script da browser gestito tramite flask ma l'unico risultato che ho ottenuto dai comandi utilizzati è ... flask run 0.0.0.0.
Mi serve anche per capire se chiudendo il tab si interrompe o meno lo script :muro:
Potrei forse utilizzare soluzioni basate sui socket?
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2842
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Come vedere se script python è in esecuzione

Messaggio da rai »

come posso vedere da sistema operativo se quel determinato script è in esecuzione?

Codice: Seleziona tutto

pgrep -f "intera linea di comando che lancia gli script racchiusa tra apici"
E c'è un modo per vedere se è stato attivato dal cron o da sito web?
Imparerò volentieri se qualcuno mi spiega un altro modo. Io sfrutterei sempre pgrep, lanciando gli script in modo programmaticamente diverso a seconda delle istanze:
per es. da cron, invece di lanciarlo come un eseguibile, potresti fare

Codice: Seleziona tutto

python nomescript
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Come vedere se script python è in esecuzione

Messaggio da vaeVictis »

Quando lanci lo script, memorizza il pid del processo, chi lo ha lanciato e il comando su un file testuale in /tmp (lo fai direttamente in Python). Ricordati di usare atexit per eliminare il record dal file quando il programma finisce.
Quindi, da sistema operativo ti leggi direttamente il contenuto del file e hai risolto.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
omegaub
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 342
Iscrizione: martedì 2 dicembre 2008, 12:50
Desktop: gnome
Distribuzione: Ubuntu 18.04.4 LTS
Sesso: Femminile
Località: Boschi romani

Re: Come vedere se script python è in esecuzione

Messaggio da omegaub »

Ciao a tutti!
Ho notato che gli script che lancio da riga di comando risultano con i vari comandi che avete suggerito ma quelli avviati tramite flask non riesco proprio ad individuarli, qual è il processo padre in questo caso? Come si chiama?
Anche la soluzione di vaeVictis mi sembra piuttosto geniale ma non saprei come fare, nel senso, che librerie e come dovrei utilizzarle per mettere in atto tale soluzione? Tipo os?
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12943
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: Come vedere se script python è in esecuzione

Messaggio da thece »

:ciao:

perchè non far fare al tuo script un pò di log? Tipo

myScript.py

Codice: Seleziona tutto

#!/usr/bin/python3

from datetime import datetime;
import os;
import subprocess;
import sys;
import time;

def main():

	try:

		pid = os.getpid();
		ppid = os.getppid();
		timestamp = datetime.now();

		logFile = open("/tmp/myScript_" + str(ppid) + "_" + timestamp.strftime("%Y%m%d%H%M%S") + ".log", "w");

		curProcess = subprocess.Popen("/usr/bin/ps | grep " + str(pid), shell = True, stdout = subprocess.PIPE);
		curOutput = curProcess.stdout.read();

		prntProcess = subprocess.Popen("/usr/bin/ps | grep " + str(ppid), shell = True, stdout = subprocess.PIPE);
		prntOutput = prntProcess.stdout.read();

		logMessage = "[+] PID: " + str(pid);
		print(logMessage);
		logFile.write(logMessage + "\n");

		logMessage = "[+] Current Process: " + curOutput.decode();
		print(logMessage);
		logFile.write(logMessage + "\n");

		logMessage = "[+] PPID: " + str(ppid);
		print(logMessage);
		logFile.write(logMessage + "\n");

		logMessage = "[+] Parent Process: " + prntOutput.decode();
		print(logMessage);
		logFile.write(logMessage + "\n");

		for index in range(10):

			timestamp = datetime.now();

			logMessage = "[+] [" + timestamp.strftime("%d/%m/%Y %H:%M:%S") + "] I'm alive!";
			print(logMessage);
			logFile.write(logMessage + "\n");

			time.sleep(1);

		logFile.close();
		sys.exit();

	except Exception as exception:

		print("[-] Something went wrong ...");
		print("[-] Exception:", str(exception));
		sys.exit();

if (__name__ == "__main__"):
	main()
Nel log (/tmp/myScript_PID_YYYYMMDDHHMMSS.log) vengono tracciati:
- PID del processo corrente
- nome del processo corrente
- PID del processo padre
- nome del processo padre
- se il processo è vivo
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Come vedere se script python è in esecuzione

Messaggio da vaeVictis »

Suggerirei di strutturare le informazioni stampate in qualche formato, per esempio JSON, di modo che sia più semplice l'acquisizione.

Edit:
Ho visto ora il messaggio dell'op precedente a quello a cui ho risposto. Appena ho modo ti mostro una soluzione. Non ho un PC sotto mano, quindi appena ne ho uno o trovo un interprete online che abbia tutte le librerie.
Comunque, a meno che non mi sfugga qualcosa, come fare è già spiegato nel messaggio precedente, con le due righe

Codice: Seleziona tutto

pid = os.getpid();
ppid = os.getppid();
Io avrei suggerimenti e considerazioni. Li faccio 'asap'.

Tornando in tema, analogamente in bash hai la variabile $$, che contiene il PID del processo associato allo script stesso. In bash (e analogamente in altre Shell) hai anche la variabile $?, Che contiene il PID dell'ultimo processo lanciato. Può essere utile ovviamente per memorizzare il PID e successivamente monitorare il processo, sia dalla stessa shell sia dall'interno di uno script (per intenderci, nello script lanci un processo, subito dopo memorizzi il valore di $? e così hai il PID di quel processo per poterlo monitorare/controllare per quanto permette il sistema operativo).

Post Edit:
I suggerimenti che avrei riguardano il file di log/output su cui vai a registrare i dati. Nell'ipotesi che il tuo programma crashi, i dati restano su quel file e di conseguenza a un successivo controllo quel processo risulterebbe attivo. Pertanto, sarebbe opportuno predisporre una procedura per cancellare il record inserito (possibilmente seguendo qualche tipo di formattazione, come ad esempio JSON). La procedura per la cancellazione del record non è spiegata nel precedente messaggio, ma corrisponde alla cancellazione di righe da un file ed è abbastanza triviale.
Questa procedura verrebbe poi chiamata al bisogno ma andrebbe anche associata a una trap dei segnali "adeguati", dove per "adeguati" si intende tutti quei segnali che causerebbero la terminazione del programma. Si trovano pacchi di informazioni riguardo questa procedura su Google. Qui ad esempio hai una discussione riguardo SIGINT. Un'altra opzione per lanciare procedure di clean up all'uscita di un programma è l'utilizzo di atexit.
In caso ci fossero dubbi, chiedi pure.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Come vedere se script python è in esecuzione

Messaggio da vaeVictis »

Ah, mi sono dimenticato una cosa. Ovviamente ci sono tutti i problemi che l'aggiornamento concorrente di un file testuale comportano.

Detto in breve, se un processo sta gia' scrivendo sul file le sue informazioni, puo' capitare che un altro processo (in questo caso proprio un altro programma) abbia la stessa esigenza in modo concorrente, quindi questo aspetto va gestito onde evitare di avere gli output scritti sul file coi noti problemi a questa procedura associati (output scritto a cazzo di cane, con conseguente necessita' di chiamare uno sciamano per fargli stampare il file in formato pdf, dargli fuoco, spargere le ceneri in una tazza in cui e' stato precedentemente versato il sangue di un SE junior, in caso l'azienda non disponga di uno stagista, e scrutinare il tutto per trarne un senso quando i corvi volano a non piu' di venticinque gradi rispetto all'orizzonte, per poi rendersi conto che tutto questo non serve a una megamazza e quindi dedicare le proprie attenzioni alla manager delle risorse umane dell'ufficio vicino).

I modi per risolverlo sono parecchi, ma ti lascio con la grande fortuna di poter cercare quello che piu' ti aggrada. Ora che fa caldo ne puoi approfittare, se ti invitano a prendere un aperitivo nella spiaggia piu' vicina acchittata come un ritrovo di macachi (a me non capita, ma ho sentito che qualche amico viene ancora coinvolto), puoi sempre rispondere che sei impegnato in ricerca e sviluppo.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Ubuntu su server”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti