Process è un'istanza in esecuzione di un programma. Linux è un sistema operativo multitasking, il che significa che più di un processo può essere attivo contemporaneamente. Usa il comando ps per scoprire quali processi sono in esecuzione sul tuo sistema.
Questo articolo spiega 7 usi pratici del comando ps e delle sue opzioni.
Per monitorare e controllare i processi, Linux fornisce molti comandi come ps, kill, killall, nice, renice e top.
1. Elenca i processi attualmente in esecuzione (ps -ef, ps -aux)
È un esempio comunemente usato con un comando ps per elencare tutti i processi attualmente in esecuzione in una macchina. L'esempio seguente mostra le opzioni del comando ps per ottenere tutti i processi.
$ ps -ef root 26551 5 0 Feb10 ? 00:03:41 [pdflush] root 26570 5 0 Feb10 ? 00:00:20 [pdflush] root 30344 3382 0 Feb21 ? 00:00:11 sshd: root@pts/14 root 30365 30344 0 Feb21 pts/14 00:00:02 -bash root 30393 3382 0 Feb21 ? 00:00:10 sshd: root@pts/15
Dove:
- -e per visualizzare tutti i processi.
- -f per visualizzare l'elenco in formato completo.
In caso di macchine BSD, puoi usare "ps -aux" per fornire i dettagli su tutto il processo come mostrato sopra.
$ ps -aux
2. Elenca il processo in base all'UID e ai comandi (ps -u, ps -C)
Utilizzare l'opzione -u per visualizzare il processo che appartiene a un nome utente specifico. Quando hai più nomi utente, separali usando una virgola. L'esempio seguente mostra tutti i processi di proprietà dell'utente wwwrun o postfix.
$ ps -f -u wwwrun,postfix UID PID PPID C STIME TTY TIME CMD postfix 7457 7435 0 Mar09 ? 00:00:00 qmgr -l -t fifo -u wwwrun 7495 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7496 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7497 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7498 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7499 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10078 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10082 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf postfix 15677 7435 0 22:23 ? 00:00:00 pickup -l -t fifo -u
Spesso ps è usato con grep come “ps -aux | grep command” per ottenere l'elenco dei processi con il comando dato.
Ma il comando ps stesso ha un'opzione per ottenere lo stesso. L'esempio seguente mostra che tutti i processi che ha tatad.pl nella sua esecuzione del comando.
$ ps -f -C tatad.pl UID PID PPID C STIME TTY TIME CMD root 9576 1 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
Nota: Possiamo creare alias per il comando ps per elencare i processi in base a comandi, utenti o gruppi.
3. Elenca i processi basati su PID o PPID (ps -p, ps –ppid)
A ogni processo verrà assegnato il Process ID (PID) univoco.
Quando avvii un'applicazione, potrebbe biforcare il numero di processi e ogni processo secondario avrà il proprio PID. Quindi, ogni processo avrà il proprio ID processo e il proprio processo padre.
Per tutti i processi che un processo fork avrà lo stesso PPID (identificatore del processo padre). Il metodo seguente viene utilizzato per ottenere un elenco di processi con un particolare PPID.
$ ps -f --ppid 9576 UID PID PPID C STIME TTY TIME CMD root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
L'esempio seguente elenca i processi che hanno fornito il PID.
$ ps -f -p 25009,7258,2426 UID PID PPID C STIME TTY TIME CMD root 2426 4 0 Mar09 ? 00:00:00 [reiserfs/0] root 7258 1 0 Mar09 ? 00:00:00 /usr/sbin/nscd postfix 25009 7435 0 00:02 ? 00:00:00 pickup -l -t fifo -u
4. Elenca i processi in una gerarchia (ps –forest)
L'esempio seguente mostra l'ID di processo e i comandi in una gerarchia. –forest è un argomento del comando ps che mostra la grafica ASCII dell'albero dei processi. Da questo albero, possiamo identificare qual è il processo padre e il processo figlio che ha biforcato in modo ricorsivo.
$ ps -e -o pid,args --forest 468 \_ sshd: root@pts/7 514 | \_ -bash 17484 \_ sshd: root@pts/11 17513 | \_ -bash 24004 | \_ vi ./790310__11117/journal 15513 \_ sshd: root@pts/1 15522 | \_ -bash 4280 \_ sshd: root@pts/5 4302 | \_ -bash
Nota: Puoi anche usare il comando tree e pstree per visualizzare il processo in una bella struttura ad albero.
5. Elenca il tempo trascorso sul muro per i processi (ps -o pid,etime=)
Se si desidera ottenere il tempo trascorso per i processi attualmente in esecuzione, il comando ps fornisce etime che fornisce il tempo trascorso dall'avvio del processo, nella forma [[dd-]hh:]mm:ss.
Il comando seguente mostra il tempo trascorso per gli ID processo 1 (init) e l'ID processo 29675.
Ad esempio, "10-22:13:29" nell'output rappresenta il processo init in esecuzione per 10 giorni, 22 ore, 13 minuti e 29 secondi. Poiché il processo di inizializzazione viene avviato durante l'avvio del sistema, questa volta sarà uguale all'output del comando 'uptime'.
# ps -p 1,29675 -o pid,etime= PID 1 10-22:13:29 29675 1-02:58:46
6. Elenca tutti i thread per un particolare processo (ps -L)
È possibile ottenere un elenco di thread per i processi. Quando un processo si blocca, potrebbe essere necessario identificare l'elenco di thread in esecuzione per un particolare processo come mostrato di seguito.
$ ps -C java -L -o pid,tid,pcpu,state,nlwp,args PID TID %CPU S NLWP COMMAND 16992 16992 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16993 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16994 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16995 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16996 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16997 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16998 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16999 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17000 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17001 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17002 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17003 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17024 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15753 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15754 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
L'opzione -L viene utilizzata per visualizzare l'elenco dei thread per un processo a cui è stato dato il comando. E mostra anche nlwp, che rappresenta il numero di processi leggeri. Nell'esempio sopra, sono in esecuzione un totale di 15 thread java.
7. Trovare perdita di memoria (ps –sort pmem)
Una perdita di memoria, tecnicamente, è un utilizzo sempre crescente della memoria da parte di un'applicazione.
Con le comuni applicazioni desktop, questo può passare inosservato, perché un processo in genere libera tutta la memoria che ha utilizzato quando chiudi l'applicazione.
Tuttavia, nel modello client/server, la perdita di memoria è un problema serio, perché le applicazioni dovrebbero essere disponibili 24 ore su 24, 7 giorni su 7. Le applicazioni non devono continuare ad aumentare l'utilizzo della memoria indefinitamente, poiché ciò può causare seri problemi. Per monitorare tali perdite di memoria, possiamo utilizzare i seguenti comandi.
$ ps aux --sort pmem USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1520 508 ? S 2005 1:27 init inst 1309 0.0 0.4 344308 33048 ? S 2005 1:55 agnt (idle) inst 2919 0.0 0.4 345580 37368 ? S 2005 20:02 agnt (idle) inst 24594 0.0 0.4 345068 36960 ? S 2005 15:45 agnt (idle) root 27645 0.0 14.4 1231288 1183976 ? S 2005 3:01 /TaskServer/bin/./wrapper-linux-x86-32
Nel comando ps sopra, l'opzione –sort restituisce la %MEM più alta in basso. Basta annotare il PID per l'utilizzo %MEM più alto. Quindi usa il comando ps per visualizzare tutti i dettagli su questo ID processo e monitorare la modifica nel tempo. Dovevi ripetere manualmente ir o inserirlo come cron in un file.
$ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32 $ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32
Nota: Nell'output sopra, se RSS (dimensione del set residente, in KB) aumenta nel tempo (così come %MEM), potrebbe indicare una perdita di memoria nell'applicazione.
Articoli precedenti nella serie sul monitoraggio e l'ottimizzazione delle prestazioni di Linux:
- 10 utili esempi Sar (Sysstat) per il monitoraggio delle prestazioni UNIX/Linux
- Introduzione al monitoraggio delle prestazioni e all'ottimizzazione di Linux
- 15 Esempi pratici di comandi principali di Linux