Come verificare che il processo sia già in esecuzione o meno


32

Voglio verificare il particolare processo già in esecuzione o meno.

Ho arbitrato queste domande e risposte .

Ma non ho ottenuto alcuna soluzione specifica. Di seguito è riportato l'esempio che ho provato: ho creato il abc.shfile ed eseguo questo script in background, come sh abc.sh &.

Ora questo file è in esecuzione in background e lancio il ps aux | grep "abc"comando.

Di seguito è riportato l'output di questo comando:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

Dopodiché interrompo lo abc.shscript in esecuzione e lancio lo stesso comando ps aux | grep "abc"comando.

Ma sto ottenendo lo stesso output come:

prakash     3594  0.0  0.0   4388   820 pts/0    S+   16:44   0:00 grep --color=auto abc

C'è un altro modo per scoprire se il processo è in esecuzione o no?

Risposte:


41

Ogni processo sarà elencato nell'output di ps aux; sia correndo, dormendo, zombi o fermato.

Tuttavia, nel tuo caso, poiché hai eseguito il processo utilizzando sh abc.sh, shè l'applicazione (shell) in esecuzione e non abc.sh. Pertanto, ps auxnon conterrà il processo a abc.shcausa del quale grepnon è stato possibile ottenere alcun risultato.

Quindi, il modo corretto che avresti dovuto usare è come:

ps aux | grep sh

Questo potrebbe anche restituirti altri processi che eseguono la stringa in shqualsiasi punto del loro output di ps aux.

Si noti che il processo sarà "in esecuzione" quando l'output di ps auxha il suo STATas R. Se è qualcosa di diverso da quello, non è in esecuzione nell'istanza in cui è stato attivato il comando per verificare i processi in esecuzione. I diversi stati del processo sono disponibili nella pagina man di ps:

D    uninterruptible sleep (usually IO)
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped, either by a job control signal or because it is being traced
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by its parent

Puoi anche eseguire il topcomando per verificare se il processo è in esecuzione o inattivo e la quantità di CPU, RAM che sta consumando. (Questo elencherà nuovamente il processo come sh).

Tuttavia, se vuoi che il tuo processo sia elencato come abc.sh, allora dovresti avere la prima riga dello script che stai eseguendo come:

#!/bin/sh

in modo che la shell sappia quale applicazione utilizzare per eseguire lo script (sh in questo caso, cambiarlo in #!/bin/bashper bash) e quindi fornire autorizzazioni eseguibili al processo usando:

chmod +x /path/to/abc.sh

sostituendo /path/to/con il percorso del abc.shfile ed eseguirlo abc.shusando

/path/to/abc.sh

sostituendo nuovamente /path/to/con la posizione del abc.shfile.


2
Una domanda veloce. cosa S+significa stat
Prakash V Holkar,

Ma puoi trovare la differenza tra i processi in esecuzione e quelli non in esecuzione attraverso l'output del ps aux | grep filenamecomando.
Avinash Raj,

@TechGuru: significa che il processo sta dormendo in primo piano, fare riferimento alla pagina del manuale di ps per ulteriori informazioni.
Jobin

@AvinashRaj: Sì, certo che puoi.
Jobin


7

Il mio problema grepè che è un parser a linea intera. Nel tuo esempio, stai cercando "abc" ma sta ritirando l'istanza di grep(che sta cercando "abc"). Un po 'circolare. Puoi filtrarlo ma lo trovo un po 'perverso.

Vorrei rivolgermi a awkun po 'di brio.

ps aux | awk '$12=="abc.sh"'

awkdivide le linee in campi in base agli spazi bianchi (per impostazione predefinita). I campi $ 11 + sono le colonne dei comandi, quindi se il comando è "sh abc.sh ...", $11sarà she $12sarà abc.sh.

Se vuoi controllare l'output o la catena con Bash &&e ||operatori, puoi ma devi essere un po 'più intelligente. grepuscirà con il codice di stato 1 (errore tecnico, trigger ||) se non viene trovato nulla ma awkuscirà sempre dal codice 0. Possiamo cambiarlo dicendogli di uscire se trova qualcosa e lanciando un 1 in caso contrario:

ps aux | awk '$12=="abc.sh" {exit 0} END{exit 1}' && echo running || echo not running

Naturalmente se ti interessa solo scrivere l'output sullo schermo, puoi farlo tutto in awk:

ps aux | awk '$12=="abc.sh" {print "running"; exit} END{print "not running"}'

4

Il modo giusto per verificare nella sessione bash corrente se un processo avviato in background, ad esempio sh abc.sh &, è già in esecuzione o meno è utilizzare il jobscomando incorporato.

Esempio:

$ sh abc.sh &
[1] 6917
$ jobs
[1]+  Running                 sh abc.sh &

Ciò significa che il sh abc.shprocesso avviato in background è in esecuzione. Se il processo è terminato vedrai qualcosa di simile:

[1]+  Done                    sh abc.sh

Se hai più processi in esecuzione in background, puoi limitare l'output solo al sh abc.shprocesso usando:

jobs sh

Vedi help jobsper maggiori informazioni.

Il metodo sopra funzionerà solo nella sessione corrente di bash. Ma se ci si trova in un'altra sessione bash (ad es. In un'altra finestra terminale o scheda, o in uno script), oltre a:

ps aux | grep "[s]h bin/test.sh"

puoi usare anche:

pgrep -a sh

che mi sembra più semplice. Se vedrai il tuo comando digitato nell'output ( sh abc.shin questo caso), ciò significa che il processo è ancora in esecuzione. In caso contrario, il processo è terminato.


3

Se lo script è attualmente in esecuzione, deve essere mostrato dal ps auxcomando. Se non viene mostrato da ps, è possibile che l'esecuzione dello script sia attualmente terminata.

L'output di psquesto significa che il tuo script non è attualmente in esecuzione,

$ ps aux | grep hm.sh
avinash   6386  0.0  0.0  15940   932 pts/16   S+   17:34   0:00 grep --color=auto hm.sh

Se viene visualizzato in questo modo, significa che lo script è attualmente in esecuzione.

$ ps aux | grep hm.sh
avinash   6454  0.0  0.0  16616  1384 pts/16   S+   17:35   0:00 /bin/bash ./hm.sh
avinash   6535  0.0  0.0  15940   932 pts/27   R+   17:35   0:00 grep --color=auto hm.sh

È tutto basato sul contenuto della sceneggiatura.

Ad esempio, se si crea uno script come questo. Visualizza il messaggio HI durante l'esecuzione. Sono necessari alcuni secondi per visualizzare l'output e terminato dopo aver prodotto il risultato finale.

#!/bin/bash
echo "HI"

Ma se la tua sceneggiatura in questo modo,

#!/bin/bash
sudo apt-get update

Ci vogliono alcuni minuti per terminare il processo. Nel frattempo, se si esegue il ps aux | grep filenamecomando, verrà visualizzato sull'output. Perché lo script è attualmente in esecuzione.


-2
  • se vuoi controllare tutti i processi, usa 'top'

  • se si desidera conoscere i processi eseguiti da Java, utilizzare ps -ef | grep java

  • se altro processo, basta usare ps -ef | grep xyzo semplicemente/etc/init.d xyz status

  • se attraverso qualsiasi codice come .shallora./xyz.sh status


1
-1 Mentre questi comandi sono utili in alcune circostanze, saranno comunque inutili per qualcuno che non conosce queste circostanze. In ogni caso o non li spieghi abbastanza o la tua spiegazione è sbagliata.
David Foerster,

-2

se vuoi semplicemente controllare se c'è qualche processo in corso, vai a quella directory e digita ll -trse vedi .csvo .worketc alla fine del file, significa che in processo altrimenti.


Questa risposta non ha senso. L'elenco dei contenuti di una directory non ti dirà se un processo è in esecuzione. L'estensione del file .csvè per i file delimitati da virgole che non sono correlati a un processo in esecuzione.
user369450
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.