GNU/Linux >> Znalost Linux >  >> Linux

8 Linuxových příkazů pro efektivní řízení procesů

Životní cyklus aplikačního procesu má obecně tři hlavní stavy:spuštění, spuštění a zastavení. Každý stát může a měl by být řízen pečlivě, chceme-li být kompetentními správci. Těchto osm příkazů lze použít ke správě procesů během jejich životního cyklu.

Spuštění procesu

Nejjednodušší způsob, jak spustit proces, je zadat jeho název do příkazového řádku a stisknout Enter. Pokud chcete spustit webový server Nginx, zadejte nginx . Možná si jen chcete zkontrolovat verzi.

alan@workstation:~$ nginx

alan@workstation:~$ nginx -v
verze nginx:nginx/1.14.0

Zobrazení cesty ke spustitelnému souboru

Výše uvedená ukázka spuštění procesu předpokládá, že se spustitelný soubor nachází ve vaší cestě ke spustitelnému souboru. Pochopení této cesty je klíčem ke spolehlivému spuštění a řízení procesu. Správci často upravují tuto cestu pro požadovaný účel. Cestu ke spustitelnému souboru můžete zobrazit pomocí echo $PATH .

alan@workstation:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

KTERÉ

Pomocí příkazu which zobrazíte úplnou cestu ke spustitelnému souboru.

alan@workstation:~$ which nginx                                                    
/opt/nginx/bin/nginx

Pro své příklady použiji oblíbený webový serverový software Nginx. Předpokládejme, že je nainstalován Nginx. Pokud příkaz který nginx nevrací nic, pak Nginx nebyl nalezen, protože který prohledává pouze vámi definovanou cestu ke spustitelnému souboru. Existují tři způsoby, jak napravit situaci, kdy proces nelze spustit pouhým jménem. První je zadat úplnou cestu. I když, raději bych to všechno nemusel psát, že?

alan@workstation:~$ /home/alan/web/prod/nginx/sbin/nginx -v
verze nginx:nginx/1.14.0

Linuxový terminál

  • 7 nejlepších emulátorů terminálu pro Linux
  • 10 nástrojů příkazového řádku pro analýzu dat v systému Linux
  • Stáhnout nyní:SSH cheat sheet
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Výukové programy příkazového řádku systému Linux

Druhým řešením by bylo nainstalovat aplikaci do adresáře v cestě ke spustitelnému souboru. To však nemusí být možné, zejména pokud nemáte oprávnění root.

Třetím řešením je aktualizovat proměnnou prostředí cesty ke spustitelnému souboru tak, aby zahrnovala adresář, kde je nainstalována konkrétní aplikace, kterou chcete použít. Toto řešení je závislé na shellu. Například uživatelé Bash by museli upravit řádek PATH=ve svém souboru .bashrc.

PATH="$HOME/web/prod/nginx/sbin:$PATH" 

Nyní zopakujte svou ozvěnu a které příkazy nebo zkuste zkontrolovat verzi. Mnohem jednodušší!

alan@workstation:~$ echo $PATH
/home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr /bin

alan@workstation:~$ který nginx
/home/alan/web/prod/nginx/sbin/nginx

alan@workstation:~$ nginx -v                                                
verze nginx:nginx/1.14.0

Udržování běžícího procesu

NOHUP

Po odhlášení nebo zavření terminálu nemusí proces pokračovat v běhu. Tomuto zvláštnímu případu se lze vyhnout tak, že před příkaz, který chcete spustit, uvedete příkaz nohup. Také připojení ampersandu (&) odešle proces do pozadí a umožní vám pokračovat v používání terminálu. Předpokládejme například, že chcete spustit myprogram.sh.

nohup myprogram.sh & 

Jedna pěkná věc, kterou nohup dělá, je vrácení PID běžícího procesu. Příště budu mluvit více o PID.

Správa běžícího procesu

Linuxový terminál

  • 7 nejlepších emulátorů terminálu pro Linux
  • 10 nástrojů příkazového řádku pro analýzu dat v systému Linux
  • Stáhnout nyní:SSH cheat sheet
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Výukové programy příkazového řádku systému Linux

Každému procesu je přiděleno jedinečné identifikační číslo procesu (PID). Toto číslo používáme k řízení každého procesu. Můžeme také použít název procesu, jak ukážu níže. Existuje několik příkazů, které mohou zkontrolovat stav běžícího procesu. Pojďme se na ně rychle podívat.

PS

Nejběžnější je ps. Výchozí výstup ps je jednoduchý seznam procesů běžících ve vašem aktuálním terminálu. Jak můžete vidět níže, první sloupec obsahuje PID.

alan@workstation:~$ ps
PID TTY          TIME CMD
23989 pts/0    00:00:00 bash
24148 pts/0    00:00:00 ps

Chtěl bych vidět proces Nginx, který jsem začal dříve. Abych to udělal, řeknu ps, aby mi ukázal každý spuštěný proces (-e ) a úplný seznam (-f ).

alan@workstation:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
kořen         1     0  0 18. srpna ? 00:00:10 /sbin/init splash
kořen         2     0  0 18. srpna ? 00:00:00 [kthreadd]
kořen         4     2  0 18. srpna ? 00:00:00 [kworker/0:0H]
kořen         6     2  0 18. srpna ? 00:00:00 [mm_percpu_wq]
kořen         7     2  0 18. srpna ? 00:00:00 [ksoftirqd/0]
kořen         8     2  0 18. srpna ? 00:00:20 [rcu_sched]
kořen         9     2  0 18. srpna ? 00:00:00 [rcu_bh]
kořen        10     2  0 18. srpna ? 00:00:00 [migrace/0]
kořen        11     2  0 18. srpna ? 00:00:00 [hlídací pes/0]
kořen        12     2  0 18. srpna ? 00:00:00 [cpuhp/0]
kořen        13     2  0 18. srpna ? 00:00:00 [cpuhp/1]
kořen        14     2  0 18. srpna ? 00:00:00 [hlídací pes/1]
kořen        15     2  0 18. srpna ? 00:00:00 [migrace/1]
kořen        16     2  0 18. srpna ? 00:00:00 [ksoftirqd/1]
alan     20506 20496  0 10:39 pts/0    00:00:00 bash
alan     20520  1454  90 ? 10:00:00:00 nginx:hlavní proces nginx
alan     20521 20520  0 10:39 ? 00:00:00 nginx:pracovní proces
alan     20526 20506  0 10:39 pts/0    00:00:00 muž ps
alan     20536 20526 09 0 pt:0 stránka
alan     20564 20496  0 10:40 bodů/1    00:00:00 bash

Procesy Nginx můžete vidět ve výstupu příkazu ps výše. Příkaz zobrazil téměř 300 řádků, ale pro tuto ilustraci jsem jej zkrátil. Jak si dokážete představit, pokusit se zpracovat 300 řádků procesních informací je trochu chaotický. Můžeme tento výstup převést na grep, abychom odfiltrovali nginx.

alan@workstation:~$ ps -ef |grep nginx
alan     20520  1454  0 10:39 ? 00:00:00 nginx:hlavní proces nginx
alan     20521 20520  0 10:39 ? 00:00:00 nginx:pracovní proces

To je lepší. Rychle vidíme, že Nginx má PID 20520 a 20521.

PGREP

Příkaz pgrep byl vytvořen, aby věci dále zjednodušil tím, že nebylo nutné volat grep samostatně.

alan@workstation:~$ pgrep nginx
20520
20521

Předpokládejme, že se nacházíte v hostitelském prostředí, kde více uživatelů provozuje několik různých instancí Nginx. Ostatní můžete z výstupu vyloučit pomocí -u možnost.

alan@workstation:~$ pgrep -u alan nginx
20520
20521

PIDOF

Další vychytávka je pidof. Tento příkaz zkontroluje PID konkrétního binárního souboru, i když běží jiný proces se stejným názvem. Abych nastavil příklad, zkopíroval jsem svůj Nginx do druhého adresáře a spustil jej s odpovídajícím nastavením předpony. V reálném životě se tato instance může nacházet v jiném umístění, například v adresáři vlastněném jiným uživatelem. Pokud spustím obě instance Nginx, ps -ef výstup zobrazuje všechny jejich procesy.

alan@workstation:~$ ps -ef |grep nginx
alan     20881  1454  0 11:18 ? 00:00:00 nginx:hlavní proces ./nginx -p /home/alan/web/prod/nginxsec
alan     20882 20881  0 11:18 ? 00:00:00 nginx:pracovní proces
alan     20895  1454  0 11:19 ? 00:00:00 nginx:hlavní proces nginx
alan     20896 20895  0 11:19 ? 00:00:00 nginx:pracovní proces

Použití grep nebo pgrep zobrazí čísla PID, ale nemusíme být schopni rozeznat, která instance je která.

alan@workstation:~$ pgrep nginx
20881
20882
20895
20896

Příkaz pidof lze použít k určení PID každé konkrétní instance Nginx.

alan@workstation:~$ pidof /home/alan/web/prod/nginxsec/sbin/nginx
20882 20881

alan@workstation:~$ pidof /home/alan/ web/prod/nginx/sbin/nginx
20896 20895

NEJLEPŠÍ

Příkaz top existuje již dlouhou dobu a je velmi užitečný pro zobrazení podrobností o běžících procesech a rychlou identifikaci problémů, jako jsou pamětní prasata. Jeho výchozí zobrazení je uvedeno níže.

nahoře - 11:56:28 nahoru 1 den, 13:37,  1 uživatel,  průměrné zatížení:0,09, 0,04, 0,03
Úkoly:celkem 292,   3 běžící, 225 spící,   0 zastaveno,   0 zombie
%Cpu(s):0,1 us, 0,2 sy, 0,0 ni, 99,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Paměť:16387132 zdarma, 38 9 03 7132 celkem využito, 108 /cache
KiB Swap:       0 celkem,        0 zdarma,        0 využito. 14176540 Dostupnost MEM

PID UŽIVATELSKÝ PROSÍM PR NI VIR RES SHR S% CPU% MEM TIME + COMMANCE
17270 Alan 20 0 3930764 247288 98992 R 0,7 1,5 5:58.22 Gnome-Shell
20496 Alan 20 0 816144 45416 29844 S 0,5 0,3 0:22.16 Gnome-Terminal-
21110 Aloma 20 0 41940 3988 3188 R 0,1 0.0 0:00.17 Top
1 Kořen 20 0 225564 9416 6768 S 0,0 0,1 0:10.72 SystemD
2 Kořen 20 0 0 0 0 s 0,0 0.0 0:00.01 Kthreadd
4 Kořen 0 -20 0 0 0 I 0.0 0.0 0:00.00 KWorker / 0:0H
6 Root 0 -20       0      0      0 I   0,0  0,0   0:00,00 mm_percpu_wq
    7 kořen      20   0       0       0       0 :0 0 0 0         0       0 0         0       0 0       0 0         0       0 0         0         0         0         0         0       0 0      0 0 0      0 0 0      0 0 .

Interval aktualizace lze změnit zadáním písmene s následovaný počtem sekund, které upřednostňujete pro aktualizace. Abychom usnadnili sledování našich ukázkových procesů Nginx, můžeme zavolat top a předat PID pomocí -p volba. Tento výstup je mnohem čistší.

alan@workstation:~$ top -p20881 -p20882 -p20895 -p20896

Úkoly:  4 celkem,   0 běží,   4 spící,   0 zastaveno,   0 zombie
%Cpu(y) ):2,8 us, 1,3 sy, 0,0 ni, 95,9 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB paměť:16387132 celkem, 108561708 kB, použito 108561708 zdarma, 108561708 buff, 3857 br> Výměna:       0 celkem,        0 zdarma,        0 využito. 14177928 Dostupnost MEM

PID UŽIVATELSKÝ PROSTŘEDÍ PR NI VIR RNE SHR S% CPU% MEM TIME + COMBAND
20881 Alan 20 0 12016 348 0 s 0,0 0.0 0:00.00 Nginx
20882 Alan 20 0 12460 1644 932 S 0.0 0,0 0:00.00 Nginx
20895 Alan 20 0 12016 352 0 s 0,0 0.0 0:00.00 Nginx
20896 Alan 20 0 12460 1628 912 s 0,0 0.0 0:00.00 Nginx

Je důležité správně určit PID při řízení procesů, zejména zastavování. Také, pokud používáte top tímto způsobem, kdykoli se jeden z těchto procesů zastaví nebo se spustí nový, top bude muset být informován o nových.

Zastavení procesu

ZABIJTE

Zajímavé je, že zde není příkaz k zastavení. V Linuxu existuje příkaz kill. Kill se používá k odeslání signálu procesu. Nejčastěji používaným signálem je „terminate“ (SIGTERM) nebo „kill“ (SIGKILL). Je jich však mnohem více. Níže jsou uvedeny některé příklady. Úplný seznam lze zobrazit pomocí kill -L .

 1) Sigint 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

Všimněte si, že signál číslo devět je SIGKILL. Obvykle vydáváme příkaz jako kill -9 20896 . Výchozí signál je 15, což je SIGTERM. Mějte na paměti, že mnoho aplikací má svůj vlastní způsob zastavení. Nginx používá -s možnost pro předání signálu, jako je „stop“ nebo „dobití“. Obecně dávám přednost použití specifické metody aplikace k zastavení operace. Předvedu však příkaz kill k zastavení procesu Nginx 20896 a poté potvrdím, že je zastaven pomocí pgrep. PID 20896 se již nezobrazuje.

alan@workstation:~$ kill -9 20896
 
alan@workstation:~$ pgrep nginx
20881
20882
20895
22123

PKILL

Příkaz pkill je podobný pgrep v tom, že může vyhledávat podle jména. To znamená, že při používání pkill musíte být velmi opatrní. V mém příkladu s Nginx bych se možná rozhodl jej použít, pokud chci zabít pouze jednu instanci Nginx. Mohu předat možnost Nginx -s stop na konkrétní instanci, abych to zabil, nebo musím použít grep k filtrování na plný výstup ps.

/home/alan/web/prod/nginx/sbin/nginx -s stop

/home/alan/web/prod/nginxsec/sbin/nginx -s stop

Pokud chci použít pkill, mohu zahrnout -f možnost požádat pkill o filtrování přes celý argument příkazového řádku. To samozřejmě platí i pro pgrep. Nejprve to tedy mohu zkontrolovat pomocí pgrep -a před vydáním pkill -f .

alan@workstation:~$ pgrep -a nginx
20881 nginx:hlavní proces ./nginx -p /home/alan/web/prod/nginxsec
20882 nginx:pracovní proces
20895 nginx:hlavní proces nginx
20896 nginx:pracovní proces

Výsledek mohu také zúžit pomocí pgrep -f . Stejný argument použitý u pkill zastaví proces.

alan@workstation:~$ pgrep -f nginxsec
20881
                                           
alan@workstation:~ng $ inxs Klíčová věc, kterou si u pgrep (a zvláště pkill) zapamatujte, je, že si musíte vždy být jisti že váš výsledek vyhledávání je přesný, takže neúmyslně neovlivňujete nesprávné procesy.

Většina těchto příkazů má mnoho možností příkazového řádku, takže vždy doporučuji přečíst si manuálovou stránku každého z nich. I když většina z nich existuje na platformách, jako je Linux, Solaris a BSD, existuje několik rozdílů. Při práci na příkazovém řádku nebo psaní skriptů vždy otestujte a buďte připraveni na opravu podle potřeby.


Linux
  1. 20 základních příkazů Linuxu pro každého uživatele

  2. 12 Užitečné příkazy pro filtrování textu pro efektivní operace se soubory v Linuxu

  3. Knihovna Python pro správu procesů v Linuxu

  1. Moje oblíbené linuxové příkazy pro optimalizaci webových obrázků

  2. 3 základní linuxové cheaty pro produktivitu

  3. Ekvivalent Process Monitor pro Linux?

  1. Použití AppImage pro správu balíčků Linuxu

  2. Cheat sheet pro běžné linuxové příkazy

  3. 10 Linuxových příkazů pro diagnostiku sítě