Ž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 NginxJe 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) SIGTERMVš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
22123PKILL
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 stopPokud 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í procesVý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