Proces je spuštěná instance programu. Linux je multitaskingový operační systém, což znamená, že může být aktivních více než jeden proces najednou. Pomocí příkazu ps zjistěte, jaké procesy běží ve vašem systému.
Tento článek vysvětluje 7 praktických použití příkazu ps a jeho možností.
Pro monitorování a řízení procesů poskytuje Linux mnoho příkazů, jako jsou příkazy ps, kill, killall, nice, renice a top.
1. Vypsat aktuálně spuštěné procesy (ps -ef, ps -aux)
Je to běžně používaný příklad s příkazem ps pro seznam všech procesů, které aktuálně běží na počítači. Následující příklad ukazuje možnosti příkazu ps pro získání všech procesů.
$ 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
Kde:
- -e pro zobrazení všech procesů.
- -f pro zobrazení seznamu v plném formátu.
V případě strojů BSD můžete použít „ps -aux“ a poskytne podrobnosti o celém procesu, jak je uvedeno výše.
$ ps -aux
2. Vypište proces na základě UID a příkazů (ps -u, ps -C)
Pomocí volby -u zobrazíte proces, který patří ke konkrétnímu uživatelskému jménu. Pokud máte více uživatelských jmen, oddělte je čárkou. Níže uvedený příklad zobrazuje všechny procesy, které vlastní uživatel wwwrun nebo 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
Často se ps používá s grep jako „ps -aux | grep příkaz“ pro získání seznamu procesů s daným příkazem.
Ale samotný příkaz ps má možnost dosáhnout stejného. Následující příklad ukazuje, že všechny procesy, které mají ve svém příkazu tatad.pl.
$ 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
Poznámka: Můžeme vytvořit aliasy pro příkaz ps pro výpis procesů na základě příkazů, uživatelů nebo skupin.
3. Vyjmenujte procesy založené na PID nebo PPID (ps -p, ps –ppid)
Každému procesu bude přiřazeno jedinečné ID procesu (PID).
Když spustíte nějakou aplikaci, může se rozdělit počet procesů a každý dílčí proces bude mít svůj vlastní PID. Každý proces tedy bude mít své vlastní ID procesu a ID nadřazeného procesu.
Pro všechny procesy, které proces rozvětvuje, bude mít stejný PPID (identifikátor nadřazeného procesu). Následující metoda se používá k získání seznamu procesů s konkrétním 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
Následující příklad obsahuje seznam procesů, které zadaly 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. Seznam procesů v hierarchii (ps –forest)
Níže uvedený příklad zobrazuje ID procesu a příkazy v hierarchii. –forest je argument příkazu ps, který zobrazuje ASCII umění stromu procesů. Z tohoto stromu můžeme identifikovat, který je nadřazený proces, a podřízený proces jej rozvětvený zpracovává rekurzivním způsobem.
$ 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
Poznámka: Můžete také použít strom a příkaz pstree k zobrazení procesu v pěkné stromové struktuře.
5. Vypsat uplynulý čas stěny pro procesy (ps -o pid,etime=)
Pokud chcete získat uplynulý čas pro procesy, které právě běží, příkaz ps poskytuje etime, který poskytuje uplynulý čas od spuštění procesu, ve tvaru [[dd-]hh:]mm:ss.
Níže uvedený příkaz zobrazuje uplynulý čas pro ID procesu 1 (init) a ID procesu 29675.
Například „10-22:13:29“ ve výstupu představuje proces init běžící po dobu 10 dnů, 22 hodin, 13 minut a 29 sekund. Protože proces init začíná během spouštění systému, bude tento čas stejný jako výstup příkazu ‚uptime‘.
# ps -p 1,29675 -o pid,etime= PID 1 10-22:13:29 29675 1-02:58:46
6. Vypsat všechna vlákna pro konkrétní proces (ps -L)
Můžete získat seznam vláken pro procesy. Když se proces zasekne, možná budeme muset identifikovat seznam vláken spuštěných pro konkrétní proces, jak je uvedeno níže.
$ 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
Volba -L se používá k zobrazení seznamu vláken pro proces, který má daný příkaz. A také zobrazuje nlwp, což představuje počet lehkých procesů. Ve výše uvedeném příkladu je spuštěno celkem 15 vláken Java.
7. Hledání úniku paměti (ps –sort pmem)
Únik paměti technicky znamená neustále se zvyšující využití paměti aplikací.
U běžných desktopových aplikací to může zůstat nepovšimnuto, protože proces obvykle uvolní veškerou použitou paměť, když aplikaci zavřete.
V modelu klient/server je však únik paměti vážným problémem, protože se očekává, že aplikace budou dostupné 24×7. Aplikace nesmí pokračovat ve zvyšování využití paměti donekonečna, protože to může způsobit vážné problémy. Ke sledování takových úniků paměti můžeme použít následující příkazy.
$ 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
Ve výše uvedeném příkazu ps volba –sort vypíše nejvyšší %MEM dole. Stačí si poznamenat PID pro nejvyšší využití % MEM. Poté pomocí příkazu ps zobrazte všechny podrobnosti o tomto ID procesu a sledujte změnu v průběhu času. Museli jste ručně opakovat ir nebo jej vložit jako cron do souboru.
$ 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
Poznámka: Pokud se ve výše uvedeném výstupu časem zvýší RSS (velikost rezidentní sady v kB) (stejně jako %MEM), může to znamenat únik paměti v aplikaci.
Předchozí články ze série sledování a ladění výkonu Linuxu:
- 10 užitečných příkladů Sar (Sysstat) pro monitorování výkonu UNIX / Linux
- Úvod do monitorování a ladění výkonu systému Linux
- 15 praktických příkladů hlavních příkazů Linuxu