Portál AbcLinuxu, 2. května 2025 07:20
V tomto díle si popíšeme program ps
, který slouží k výpisu (stavu) běžících procesů, a program kill
sloužící k posílání signálů procesům.
ps
je příkaz sloužící k výpisu informací o právě běžících procesech v systému. Název vychází z anglického process status, což znamená stav procesu.
Spustíte-li ps
jen tak (bez argumentů), vypíše pouze procesy, které mají stejný ovládací terminál jako daná instance ps
a zároveň stejné efektivní UID.
$ ps PID TTY TIME CMD 6091 pts/5 00:00:06 bash 29766 pts/5 00:00:00 ps
S přepínačem -a vypíše všechny procesy, které mají řídící terminál. Přepínač -A potom vypíše procesy úplně všechny, zrovna tak jako jeho ekvivalent -e. Podrobnější seznam procesů (s více informacemi) program vypíše, předáte-li mu přepínač -f. Pokud je vám i tohle málo, zkuste přidat ještě -l.
# vypíše detailní seznam všech procesů ps -ef # ještě detailnější seznam… ps -elf
Chcete-li vypsat seznam procesů pro dané skupiny či uživatele, potom vám poslouží přepínače -G a -U.
# vypíše seznam procesů skupiny „home“ ps -G home # vypíše detailní seznam procesů uživatele „dave“ ps -flU dave
ps
umožňuje sestavení vlastního formátu výpisu informací pomocí přepínače -o, tak to zkusme:
# vypíše seznam všech procesů a od každého procesu # UID, PID, využití RAM (RSS) a název příkazu (CMD) ps -Ao "uid pid rss cmd" # pokud se vám nelíbí hlavička, kterou ps na začátku # vypisuje, zadejte vlastní popisky ps -Ao "uid=Uživatel pid=Proces rss=RAM cmd=Příkaz" # pokud váš popisek obsahuje mezery, zadejte -o vícekrát ps -A -o "user=Uživatelské jméno" -o pid="Číslo procesu (PID)"
Kompletní seznam informací, které si můžete nechat vypsat, a jejich zkratky naleznete v manuálu. Můžete si nechat vypsat pouze zadaná UID:
ps -fl 1 2 F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 – 974 ? 03:35 ? 0:00 init [3] 1 S root 2 0 0 80 0 – 0 ? 03:35 ? 0:00 [kthreadd]
Doteď jsem popisoval verzi dle standardu, ovšem na GNU/Linuxu se obvykle setkáte s verzí z balíku procps
a BSD systémy mají také vlastní implementaci. Tyto implementace obsahují ještě další vymoženosti. Například podporují několik „přepínačů“, které nezačínají znakem „-“.
# vypíše seznam všech procesů (s více informacemi než -ef, ale méně než -el) ps axu # zajistí, aby se vypsal kompletní název příkazu i s argumenty ps axuww # přepínač „f“ slouží s výpisu stromu procesů ps faxu
Příkaz ps
se často používá v kombinaci s programem grep. Tato kombinace totiž umožňuje rychle zjistit, zda na systému běží určitý proces.
ps ax | grep lighttpd
Podobný příkaz na Windows je tasklist
, případně v PowerShellu je přímo alias ps
, který volá Get-Process.
kill
je nástroj sloužící k poslání signálu daným PID. Název programu je anglické slovo, které znamená „zabít“ (proces). V tomto kontextu je to myšleno jako „nuceně ukončit“ proces, což dělá pouze jeden ze signálů, které kill
může vyslat.
Signály jsou prostředek k jednoduché komunikaci mezi procesy na unixových systémech. Každému procesu lze poslat signál, přičemž máme-li dostatečné oprávnění, proces na něj zareaguje. Pomocí signálů lze proces ukončit, pozastavit, přerušit, atd. Ovšem signál může vyvolat i jinou akci – programátoři mají možnost signály ve svých programech obsluhovat nebo ignorovat. Například když programu přijde signál 15 (tj. TERM – ukončit), tak lze naprogramovat to, aby se nejdříve uložila načatá práce a teprve potom se program ukončil.
Jak jsem naznačil, signály mají přiřazená čísla i názvy. Signály jsme si kdysi pojmenovali nejen proto, abychom si nemuseli pamatovat čísla, ale také proto, že čísla se na různých systémech mohou lišit. Vyjmenujeme a popíšeme si několik používanějších signálů.
Číslo | Název | Zjednodušený popis |
1 | HUP (Hangup) | Tento signál proces obdrží tehdy, když je uzavřen jeho řídící terminál. |
2 | INT (Interrupt) | Toto je signál, který proces obdrží, když běží v terminálu a uživatel stiskne Ctrl+C. Obvykle ukončí proces. |
3 | QUIT | Ukončí proces a zapíše stav paměti, se kterou program pracoval (tzv. core dump). |
4 | ILL (Illegal instruction) | Tento signál posílá operační systém, když proces vyvolá neznámou instrukci. |
8 | FPE (Floating point exception) | Tímto signálem jádro trestá programy, které se snaží dělit nulou, atp. |
9 | KILL (Kill) | „Zabije“ proces (okamžitě). Nelze obejít. |
10 | USR1 (User-defined) | Uživatelsky definovaný signál. |
11 | SEGV (Segmentation fault) | Obvykle posílá operační systém programům, které chybně pracují s pamětí. |
15 | TERM (Terminate) | Ukončí proces. |
19 | STOP | Zastaví proces. Nelze obejít. |
20 | TSTP (Terminal stop) | Zastaví proces, ale lze obejít. Tento signál proces obdrží, když běží interaktivně v shellu a uživatel stiskne Ctrl+Z. |
18 | CONT (Continue) | Obnoví běh procesu po obdržení některého ze dvou předchozích signálů. |
Názvy signálů vždy začínají řetězcem „SIG“ (jako signál), takže chceme-li ukončit proces signálem, tak říkáme, že mu posíláme SIGTERM.
Nyní k samotnému programu kill
. Spustíme-li jej s přepínačem „-l“, vypíše všechny signály podporované danou implementací.
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
Zadáme-li přepínači „-l“ jako argument celé nezáporné číslo, vrátí nám odpovídající název signálu. Zadáme-li jako argument název signálu (bez „SIG“), vrátí nám odpovídající číslo.
$ kill -l 1 HUP $ kill -l TRAP 5
Když programu předáme přepínač -s s číslem nebo názvem signálu a za něj přidáme jedno nebo více PID, kill
pošle daným PID daný signál. Totéž se stane, když místo přepínače -s zadáme číslo nebo název signálu rovnou za pomlčku.
# pošle signál SIGHUP procesu s PID 1 (tj. init) kill -s HUP 1 # totéž kill -HUP 1 # totéž kill -1 1
Podobná, ale nestandardní utilita killall
(z balíku psmisc
) slouží k témuž účelu jako kill
, ale místo PID jí předáváme název programu, kterému chceme poslat signál. Pozor, běží-li více instancí programu, signál se pošle všem, ke kterým máme příslušná oprávnění.
# zabije všechny instance programu "firefox" killall -s 9 firefox
ps -A | grep lighttpd
ps axu | grep proceskdyž chci vidět i jméno uživatele, s jehož právy proces běží.
pgrep
?
Tímto signálem jádro trestá programy, které se snaží dělit nulou, atp.:)
pstree
nebo ps fax
.
pgrep -P X
ps
) podívat a dát v ní vyhledat "PPID"? Nebylo by to jednodušší a rychlejší než psát dotaz?
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.