[RISOLTO] Controllo su processi

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns e altro.
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: venerdì 12 gennaio 2007, 17:02
Località: Lecce

[RISOLTO] Controllo su processi

Messaggio da ender »

Ciao a tutti, un consulto su un semplice quesito:

qual è il metodo migliore per controllare se uno script è già in esecuzione?
mi spiego.. ho uno script pippo.sh e quando lo lancio dura almeno 2 minuti, se un'altra persona si collega alla macchina e lo lancia mi distrugge tutto il lavoro, pertanto se lo script è già in esecuzione glielo deve dire..

Avevo fatto una cosa del genere:

Codice: Seleziona tutto

var=`ps -ef | grep pippo| grep -v grep|wc-l`
if [ $var -ne 2 ]; then
echo "Script gia' in esecuzione da un altro utente."
exit
fi
in poche parole appena lancio lo script si creano 2 processi (non so perché 2 e non 1, comunque...) quindi se il mio controllo restituisce un valore diverso da 2 (quindi se un altro prova ad eseguirlo diventano 4) esce.
Il problema è che a quanto pare alle volte dice che è in esecuzione ma non è vero, rilanciandolo un secondo dopo parte... provabilmente certe volte forka 2 processi altre volte 1, probabilmente...
Siccome questo script viene richiamato da un altro script ancora più cazzuto se decide di fregare il mio controllo esce e rovina il lavoro anche dell'altro script..

Non so se mi sono espresso bene... ma volevo trovare un modo SICURO affinché lo script venga eseguito solo da un utente (che poi l'utenza è sempre root) e che mi dica SEMPRE la verità se è in esecuzione oppure no....


Grazie
Ultima modifica di ender il lunedì 20 febbraio 2017, 12:05, modificato 1 volta in totale.
Because Micro$oft is for Capitalists running DOS!!!
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12943
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: Controllo su processi

Messaggio da thece »

:ciao:

Codice: Seleziona tutto

ps -ef | grep pippo
trova correttamente due processi: il primo è il processo pippo (se in esecuzione), il secondo è il processo grep (su pippo).
Nel tuo script prova ad usare pgrep così

Codice: Seleziona tutto

#!/bin/bash

if [[ -z "$1" ]]; then
        echo "No argument!"
        exit 1
fi

PROCESS="$(pgrep $1)"

if [[ ! -z "$PROCESS" ]]; then
        echo "Process $1 found!"
else
        echo "Process $1 not found!"
fi

exit 0
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: venerdì 12 gennaio 2007, 17:02
Località: Lecce

Re: Controllo su processi

Messaggio da ender »

Ciao,
intanto grazie per la risposta.
Sì, so che uno dei due processi è del grep, infatti avevo scritto nel mio codice:

Codice: Seleziona tutto

var=`ps -ef | grep pippo| grep -v grep|wc-l`
in questo modo mi dà giustamente 1 processo... il fatto è che mi da due processi uguali ma con pid diverso (che non è quello del grep perché l'ho escluso con grep -v). Ho fatto questa prova per vedere, lanciando ogni secondo il processo, quante volte mi crea un processo e quante volte due, il risultato me lo redirige in un file, provando a lanciare lo script da due sessioni diverse ripetutamente e il risultato del wc -l è :

Codice: Seleziona tutto

cat file.txt
1
1
1
2
1
1
1
2
1
1
1
...
come si può notare alle volte me ne crea giustamente uno, altre volte due... quando ne crea due è così:

Codice: Seleziona tutto

root     15787 13516  0 17:13 pts/5    00:00:00 /bin/sh ./script/pippo.sh
root     15789 15787  0 17:13 pts/5    00:00:00 /bin/sh ./script/pippo.sh
sono identici con pid e ppid diversi.

Codice: Seleziona tutto

[root@linserv]# ./pippo.sh
Script gia' in esecuzione da un altro utente.

[root@linserv]# ./pippo.sh
Script gia' in esecuzione da un altro utente.

[root@linserv]# ./pippo.sh
SCRIPT NON IN ESECUZIONE (HA UN PROCESSO) CONTINUO ESECUZIONE
In questo caso alla terza volta è partito, ma perché fa così? random decide di creare due processi, anche con pgrep la volta che ne crea due mi fa vedere due processi.
Because Micro$oft is for Capitalists running DOS!!!
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12943
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: Controllo su processi

Messaggio da thece »

Prova questi

aProcess.sh

Codice: Seleziona tutto

#!/bin/bash


echo "Sleeping ..."
sleep 60


exit 0
aProcessChecker.sh meglio aProcessLauncher.sh

Codice: Seleziona tutto

#!/bin/bash


PROCESS_NAME="aProcess.sh"
PROCESS_CHECK="$(pgrep $PROCESS_NAME)"


if [[ ! -z "$PROCESS_CHECK" ]]; then
        echo "Process $PROCESS_NAME found!"
        exit 1
else
        echo "Process $PROCESS_NAME not found!"
        ./aProcess.sh
fi


exit 0
Li ho scritti in 2 minuti, non sono rifiniti ... quindi mettili ed eseguili dalla stessa directory
Ultima modifica di thece il lunedì 20 febbraio 2017, 10:36, modificato 1 volta in totale.
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: venerdì 12 gennaio 2007, 17:02
Località: Lecce

Re: Controllo su processi

Messaggio da ender »

Ciao,
scusa ma non riesco a capire a cosa serve il parametro -z (il ! credo stia per negazione). Vuol dire se esiste? perché in giro li trovo tutti tranne il -z.
Because Micro$oft is for Capitalists running DOS!!!
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12943
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: Controllo su processi

Messaggio da thece »

-z è un pericolosissimo parametro che permette all'astuto hacker di formattarti il PC senza il tuo consenso ;) :D :lol:

Ma che ricerca hai fatto? Leggi QUI
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: venerdì 12 gennaio 2007, 17:02
Località: Lecce

Re: Controllo su processi

Messaggio da ender »

Che pirla che sono! Mi fissavo con gli operatori di verifica sui file e non quelli di confronto... vabbé è lunedì :D

Comunque, se il pgrep dà qualcosa (indipendentemente da cosa) esce, altrimenti aspetta 60 secondi e poi esce... ok. Ma come può tornarmi utile?

Il discorso è che deve esserci uno e un solo processo, e spesso ne dà due.
Because Micro$oft is for Capitalists running DOS!!!
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 12943
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: Controllo su processi

Messaggio da thece »

ender [url=http://forum.ubuntu-it.org/viewtopic.php?p=4960234#p4960234][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto: Comunque, se il pgrep dà qualcosa (indipendentemente da cosa) esce, altrimenti aspetta 60 secondi e poi esce... ok. Ma come può tornarmi utile?
No, decisamente non hai capito. Ti spiego:

- lo script aProcess.sh è un'astrazione di un qualsiasi processo che fa qualcosa per un certo periodo di tempo e poi (naturalmente) termina.
Banalmente ho usato sleep per simulare un'attività di 60 secondi. Potevo fargli eseguire un algoritmo di ray tracing ma sai com'è ... era un pò complicato

- lo script aProcessLauncher.sh è quello che svolge l'attività di controllo e avvio del processo di elaborazione vero e proprio: aProcess.sh. Se trova il processo in esecuzione non fa nulla, se non lo trova lo avvia. Avviando il processo di elaborazione sempre attraverso lo script aProcessLauncher.sh non potreanno mai esserci due processi aProcess.sh in esecuzione contemporaneamente


Spero che ti sia chiaro che se un processo controlla se "esso stesso" è in esecuzione, troverà che è sempre vero ... ovviamente!


Un altro metodo che non ha bisogno del "launcher" ma che richiede la conoscenza del proprio PID potrebbe essere il seguente: il processo si avvia. Controlla la lista dei processi in esecuzione. Se trova un processo (in esecuzione) che ha il proprio nome ma PID differente dal proprio, si arresta.

Script di esempio: aProcess.sh

Codice: Seleziona tutto

#!/bin/bash


PROCESS_PID=$$
PROCESS_NAME="aProcess.sh"
PROCESS_CHECK="$(pgrep $PROCESS_NAME)"
PROCESS_NOT_CHECK="$(echo $PROCESS_CHECK | sed "s/$PROCESS_PID//g")"


if [[ -z "$PROCESS_NOT_CHECK" ]]; then
        echo "Process '$PROCESS_NAME' not found!"
        echo "Sleeping ..."
        sleep 60
else
        echo "Process '$PROCESS_NAME' found!"

fi


exit 0
oppure

Codice: Seleziona tutto

#!/bin/bash


PROCESS_PID="$$"
PROCESS_NAME="aProcess.sh"
declare -a PROCESS_PID_ARRAY=($(pgrep $PROCESS_NAME))


if (( ${#PROCESS_PID_ARRAY[*]} <= 1 )); then
        echo "Process '$PROCESS_NAME' not found!"
        echo "Sleeping ..."
        sleep 60
else
        echo "Process '$PROCESS_NAME' found!"
fi


exit 0
Ultima modifica di thece il lunedì 20 febbraio 2017, 23:29, modificato 5 volte in totale.
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: venerdì 12 gennaio 2007, 17:02
Località: Lecce

Re: Controllo su processi

Messaggio da ender »

Ahahaha rido di me stesso, sono doppiamente pirla! Ho capito adesso...
Ho letto bene e interpretato male. Grazie mi hai dato l'input che cercavo e risolto il mio "problema"... (onestamente potevo arrivarci da solo :D)

Grazie ancora.
Ciao
Because Micro$oft is for Capitalists running DOS!!!
Scrivi risposta

Ritorna a “Ubuntu su server”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti