[RISOLTO] Controllo su processi

Installazione, configurazione e uso di Ubuntu come server: web, ftp, mail, news, proxy, dns, ecc.

[RISOLTO] Controllo su processi

Messaggioda ender » venerdì 17 febbraio 2017, 17:15

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, 13:05, modificato 1 volta in totale.
Because Micro$oft is for Capitalists running DOS!!!
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 348
Iscrizione: gennaio 2007
Località: Lecce

Re: Controllo su processi

Messaggioda thece » venerdì 17 febbraio 2017, 17:40

: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
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7226
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: Controllo su processi

Messaggioda ender » venerdì 17 febbraio 2017, 18:26

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
ender
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 348
Iscrizione: gennaio 2007
Località: Lecce

Re: Controllo su processi

Messaggioda thece » venerdì 17 febbraio 2017, 18:47

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, 11:36, modificato 1 volta in totale.
Avatar utente
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7226
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: Controllo su processi

Messaggioda ender » lunedì 20 febbraio 2017, 10:58

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
ender
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 348
Iscrizione: gennaio 2007
Località: Lecce

Re: Controllo su processi

Messaggioda thece » lunedì 20 febbraio 2017, 11:03

-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
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7226
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: Controllo su processi

Messaggioda ender » lunedì 20 febbraio 2017, 12:31

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
ender
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 348
Iscrizione: gennaio 2007
Località: Lecce

Re: Controllo su processi

Messaggioda thece » lunedì 20 febbraio 2017, 12:39

ender Immagine 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 martedì 21 febbraio 2017, 0:29, modificato 5 volte in totale.
Avatar utente
thece
Rampante Reduce
Rampante Reduce
 
Messaggi: 7226
Iscrizione: aprile 2007
Distribuzione: Debian 8 (Jessie) - KDE 4.14

Re: Controllo su processi

Messaggioda ender » lunedì 20 febbraio 2017, 13:05

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!!!
Avatar utente
ender
Scoppiettante Seguace
Scoppiettante Seguace
 
Messaggi: 348
Iscrizione: gennaio 2007
Località: Lecce


Torna a Ubuntu su server

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 7 ospiti