GNU/Linux >> Znalost Linux >  >> Linux

Pochopení procesů v Linuxu

Tento výukový program poskytuje podrobnosti o tom, co jsou procesy, jak se používají a jak je lze spravovat v systému Linux.

Jako správce systému jste pravděpodobně interagovali s procesy mnoha různými způsoby.

Někdy můžete chtít spouštět příkazy, abyste identifikovali procesy, které spotřebovávají mnoho zdrojů na vašem hostiteli.

Možná jste obdrželi hovor od uživatele, že se jeden z jeho procesů zasekl a že jej možná budete muset ukončit, abyste mohli pokračovat v práci.

Procesy jsou skutečně středem operačního systému Linux:vytvořené samotným jádrem představují běžící operace, které aktuálně probíhají na vašem hostiteli Linux.

Procesy jsou všude, mohou běžet na pozadí nebo je můžete pro vlastní operace inicializovat sami.

Můžete se rozhodnout začít je přerušit obnovit nebo je zastavit je.

V dnešním tutoriálu se velmi podrobně podíváme na procesy, co to je a jak se používají v našem operačním systému.

Objevíme všechny příkazy spojené s procesy, co jsou signály a jak můžeme našim stávajícím procesům přiřadit více výpočetních zdrojů.

Jste připraveni?

Co se naučíte

Přečtením tohoto návodu až do konce se dozvíte o následujících konceptech

  • Co zpracovává jsou a jak jsou vytvořeny v systému Linux
  • Jak lze procesy identifikovat v systému Linux
  • Jaké pozadí a popředí procesy jsou
  • Jaké signály jsou a jak je lze použít k interakci s procesy
  • Jak používat pgrep stejně jako pkill efektivně velet
  • Jak upravit prioritu procesu pomocí nice a renice
  • Jak zobrazit aktivitu procesu v reálném čase v systému Linux

To je poměrně dlouhý program, takže bez dalších okolků začněme stručným popisem toho, co jsou procesy.

Základy procesů Linuxu

Stručně řečeno, procesy spouštějí programy na vašem hostiteli Linux které provádějí operace, jako je zápis na disk, zápis do souboru nebo například spouštění webového serveru.

Proces má vlastníka a jsou identifikovány ID procesu (také nazývané PID )

Na druhou stranu programy jsou řádky nebo kód nebo řádky strojových instrukcí uložených na trvalém datovém úložišti.

Mohou jen sedět na vašem datovém úložišti nebo mohou být v běhu, tj. spuštěny jako procesy.

Aby mohly procesy provádět operace, ke kterým jsou přiřazeny, potřebují zdroje :Čas CPU , paměť (například RAM nebo místo na disku ), ale také virtuální paměti, jako je swap space pro případ, že váš proces bude příliš chamtivý.

Procesy lze samozřejmě spustit , zastaveno , přerušeno a dokonce zabil .

Před zadáním jakýchkoli příkazů se podívejme, jak procesy vytváří a spravuje samotné jádro.

Inicializace procesu v systému Linux

Jak jsme již uvedli, procesy jsou řízeny jádrem na Linuxu.

Existuje však základní koncept, kterému musíte porozumět, abyste věděli, jak Linux vytváří procesy.

Ve výchozím nastavení, když spouštíte systém Linux, je vaše jádro Linuxu načteno do paměti, je mu přidělen virtuální souborový systém v paměti RAM (také nazývaný initramfs ) a provedou se počáteční příkazy.

Jeden z těchto příkazů spustíúplně první proces v Linuxu.

Historicky se tento proces nazýval proces init, ale v mnoha nedávných distribucích Linuxu byl nahrazen procesem inicializace systemd.

Chcete-li to dokázat, spusťte na svém hostiteli následující příkaz

$ ps -aux | head -n 2

Jak můžete vidět, proces systemd máPID 1.

Pokud byste vytiskli všechny procesy ve vašem systému pomocí zobrazení stromu, zjistili byste, že všechny procesy jsou potomky systému systemd.

$ pstree

Je pozoruhodné zdůraznit skutečnost, že všechny tyto inicializační kroky (kromě spuštění počátečního procesu) se provádějí ve vyhrazeném prostoru zvaném jaderný prostor.

Prostor jádra je prostor vyhrazený pro jádro aby správně spouštěl základní systémové nástroje a aby se zajistilo, že celý váš hostitel běží konzistentně.

Na druhou stranu uživatelský prostor je vyhrazen pro procesy spouštěné uživatelem a spravované samotným jádrem.

V důsledku toho je proces systemd úplně prvním procesem spuštěným v uživatelském prostoru.

Vytváření procesů pomocí Fork a Exec

Když vytváříte a spouštíte program v systému Linux, obvykle zahrnuje dva hlavní kroky:fork a provést .

Obsluha vidlice

Fork je klonovací operace, vezme aktuální proces, nazývaný také rodičovský proces, a naklonuje ho do nového procesu se zcela novým ID procesu.

Při vytváření větví se vše zkopíruje z nadřazeného procesu:zásobník , hromada , ale také deskriptory souborů znamenající standardní vstup, standardní výstup a standardní chybu.

Znamená to, že pokud můj nadřazený proces zapisoval do aktuální konzoly shellu, podřízený proces bude také zapisovat do konzole shellu.

Provádění klonovaného procesu se také spustíse stejnou instrukcí jako rodičovský proces.

Provést operaci

Operace spuštění se v Linuxu používá k nahrazení aktuálního obrazu procesu obrazem z jiného procesu.

Na předchozím diagramu jsme viděli, že zásobník nadřazeného procesu obsahoval tři instrukce.

V důsledku toho byly instrukce zkopírovány do nového procesu, ale nejsou relevantní pro to, co chceme provést.

Operace exec nahradí obraz procesu (tj. sadu instrukcí, které je třeba provést) jiným.

Pokud byste například spustili příkaz exec ve vašem bash terminálu, váš shell by se ukončil, jakmile je příkaz dokončen, protože váš aktuální obraz procesu (váš bash interpret) by byl nahrazen kontextem příkazu, který se pokoušíte spustit. .

$ exec ls -l

Pokud byste měli sledovat systémová volání provedená při vytváření procesu, zjistili byste, že první volaný příkaz C je příkaz exec.

Vytváření procesů z prostředí shellu

Když spouštíte konzolu shellu, platí úplně stejné principy, když spouštíte příkaz.

Shell konzole je proces, který čeká na vstup od uživatele.

Po stisknutí klávesy Enter také spustí interpret bash a poskytuje prostředí pro spouštění vašich příkazů.

Ale shell se řídí kroky, které jsme popsali dříve.

Když stisknete Enter,shell se rozvětví na podřízený proces která bude zodpovědná za spuštění vašeho příkazu. Shell bude trpělivě čekat, dokud neskončí provádění podřízeného procesu.

Na druhou stranu podřízený proces je propojen se stejnými deskriptory souborů a může sdílet proměnné, které byly deklarovány v globálním rozsahu.

Podřízený proces provede „exec ” za účelem nahrazení aktuálního obrazu procesu (což je obraz procesu shellu) v obrazu procesu příkazu, který se pokoušíte spustit.

Podřízený proces nakonec skončí a vytiskne svůj výsledek na standardní výstup, který zdědil od nadřazeného procesu, v tomto případě samotné konzole shellu.

Nyní, když máte nějaké základy o tom, jak se procesy vytvářejí ve vašem prostředí Linuxu, pojďme se podívat na některé podrobnosti o procesech a jak je lze snadno identifikovat.

Identifikace běžících procesů v systému Linux

Nejjednodušší způsob, jak identifikovat běžící procesy v Linuxu, je spustit ps příkaz.

$ ps

Ve výchozím nastavení vám příkaz ps zobrazí seznam aktuálně běžících procesů vlastněných aktuálním uživatelem.

V tomto případě pro mého uživatele běží pouze dva procesy:překladač bash a příkaz ps Narazil jsem na to.

Zde je důležité, že procesy mají vlastníky , většinou uživatel, který je spouští na prvním místě.

Pro ilustraci si uveďme seznam prvních deseti procesů ve vašem operačním systému Linux s jiným formátem zobrazení.

$ ps -ef | head -n 10

Jak můžete vidět zde, prvních deset procesů vlastní uživatel „root “.

Tyto informace budou obzvláště důležité, pokud jde o interakci s procesy se signály.

Chcete-li zobrazit procesy, které vlastní a spouští aktuálně připojený uživatel, spusťte následující příkaz

$ ps u

Existuje spousta různých možností pro příkaz ps a lze je zobrazit spuštěním příkazu manual.

$ man ps

Ze zkušenosti jsou dva nejdůležitější příkazy pro zobrazení běžících procesů

ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

To odpovídá výpisu procesů ve stylu BSD , kde je následující příkaz

ps -ef

UID  PID  PPID C STIME TTY  TIME CMD

Odpovídá výpisu procesu ve stylu POSIX .

Oba představují aktuálně běžící procesy v systému, ale první z nich má možnost „u“ pro „uživatelsky orientované“, což usnadňuje čtení metrik procesů.

Nyní, když jste viděli, co jsou procesy a jak mohou být uvedeny, pojďme se podívat, jaké procesy na pozadí a v popředí jsou na vašem hostiteli.

Procesy na pozadí a v popředí

Definice procesů na pozadí a v popředí je docela samozřejmá.

Úlohy a procesy v aktuálním prostředí

Proces na pozadí v Linuxu je proces, který běží na pozadí, což znamená, že není aktivně spravován uživatelem, například prostřednictvím shellu.

Na druhé straně proces v popředí je proces, se kterým lze interagovat prostřednictvím přímého uživatelského vstupu.

Řekněme například, že jste otevřeli shellový terminál a že jste do konzole zadali následující příkaz.

$ sleep 10000

Jak jste si pravděpodobně všimli, váš terminál bude viset až do ukončení procesu spánku. V důsledku toho se proces neprovádí na pozadí, ale na popředí.

Jsem schopen s tím interagovat. Pokud stisknu Ctrl + Z, odešle to například signál zastavení procesu.

Existuje však způsob, jak proces provést na pozadí.

Chcete-li provést proces na pozadí, jednoduše vložte „& ” na konci vašeho příkazu.

$ sleep 10000 &

Jak můžete vidět, ovládání bylo vráceno přímo uživateli a proces se začal spouštět na pozadí

Chcete-li vidět běžící proces, v kontextu aktuálního shellu můžete spustit příkaz jobs

$ jobs

Úlohy jsou seznam procesů, které byly spuštěny v kontextu aktuálního prostředí a které mohou stále běžet na pozadí.

Jak můžete vidět v příkladu výše, na pozadí aktuálně běží dva procesy.

Různé sloupce zleva doprava představujíID úlohy, stav procesu (které objevíte v další části) a příkaz byl proveden.

Použití příkazů bg a fg

Abyste mohli pracovat s úlohami, máte k dispozici dva příkazy:bg a fg .

Příkaz bg se v systému Linux používá k odeslání procesu na pozadí a syntaxe je následující

$ bg %<job_id>

Podobně, chcete-li odeslat proces do popředí, můžete použít fg stejným způsobem

$ fg %<job_id>

Pokud se vrátíme k seznamu úloh z našeho předchozího příkladu, pokud chci přenést úlohu 3 do popředí, tedy do aktuálního okna shellu, provedl bych následující příkaz

$ fg %3

Vydáním příkazu Ctrl + Z jsem schopen proces zastavit. Mohu jej propojit s příkazem bg a odeslat jej na pozadí.

Nyní, když máte lepší představu o tom, co jsou procesy na pozadí a v popředí, pojďme se podívat, jak je možné s procesem interagovat pomocí signálů.

Interakce s procesy pomocí signálů

V systému Linux jsou signály formou meziprocesové komunikace (také nazývané IPC ), který vytváří a odesílá asynchronní upozornění běžícím procesům o výskytu konkrétní události.

K zaslání zabití se často používají signály nebo příkaz k ukončení procesu za účelem jeho vypnutí (také nazývaného kill signál).

Abyste mohli poslat signál procesu, musíte použít kill příkaz.

$ kill -<signal number> <pid>|<process_name>

Chcete-li například vynutit ukončení procesu HTTPD (PID =123) (bez čistého vypnutí), spustili byste následující příkaz

$ kill -9 123

Vysvětlení kategorií signálů

Jak bylo vysvětleno, existuje mnoho signálů, které lze vyslat, aby upozornili konkrétní proces.

Zde je seznam nejběžněji používaných:

  • SIGINT :zkratka pro přerušení signálu je signál používaný k přerušení běžícího procesu. Je to také signál, který se odesílá, když uživatel stiskne Ctrl + C na terminálu;
  • VZDYCHNOUT :zkratka pro signal hangup je signál vyslaný vaším terminálem, když je zavřený. Podobně jako u SIGINT se proces ukončí;
  • SIGKILL :signál používaný k vynucení zastavení procesu bez ohledu na to, zda jej lze plynule zastavit nebo ne. Tento signál nelze ignorovat kromě procesu init (nebo systémového u nedávných distribucí);
  • SIGQUIT :specifický signál odeslaný, když chce uživatel ukončit nebo ukončit aktuální proces. Lze jej vyvolat stisknutím Ctrl + D a často se používá v terminálových shellech nebo v relacích SSH;
  • SIGUSR1, SIGUSR2 :tyto signály se používají čistě pro komunikační účely a lze je použít v programech za účelem implementace vlastních obslužných programů;
  • SIGSTOP :Instruuje proces, aby zastavil jeho provádění bez ukončení procesu. Proces pak čeká na pokračování nebo na úplné zabití;
  • SIGCONT :pokud je proces označen jako zastavený, dá procesu pokyn k opětovnému zahájení jeho provádění.

Chcete-li zobrazit úplný seznam všech dostupných signálů, můžete spustit následující příkaz

$ 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
63) SIGRTMAX-1  64) SIGRTMAX

Stavy signálů a procesů

Nyní, když víte, že je možné přerušit, ukončit nebo zastavit procesy, je čas, abyste se dozvěděli o stavech procesů.

Procesy mají mnoho různých stavů, mohou to být :

  • Spuštěno :běžící procesy jsou ty, které v aktuálním čase využívají určitý výpočetní výkon (jako je čas CPU). Proces lze také nazvat „spustitelný“, pokud jsou splněny všechny podmínky běhu a plánovač CPU čeká na určitý čas CPU.
  • Zastaveno :signál je zastaven je spojen se signálem SIGSTOP nebo s klávesovou zkratkou Ctrl + Z. Provádění procesu je pozastaveno a čeká buď na SIGCONT nebo na SIGKILL.
  • Spánek :spící proces je proces, který čeká na nějakou událost nebo na zpřístupnění zdroje (např. disku).

Zde je schéma, které představuje různé stavy procesu spojené se signály, které jim můžete poslat.

Nyní, když víte trochu více o stavech procesů, pojďme se podívat na příkazy pgrep a pkill.

Manipulační proces pomocí pgrep a pkill

V Linuxu již existuje mnoho, co můžete udělat jednoduše pomocí příkazu ps.

Své hledání můžete zúžit na jeden konkrétní proces a pomocí PID jej můžete úplně zabít.

Existují však dva příkazy, které byly navrženy tak, aby byly vaše příkazy ještě kratší:pgrep a pkill

Pomocí příkazu pgrep

pgrep command je zkratka pro použití příkazu ps zprostředkovaného pomocí příkazu grep.

Příkaz pgrep vyhledá všechny výskyty určitého procesu pomocí názvu nebo definovaného vzoru.

Syntaxe příkazu pgrep je následující

$ pgrep <options> <pattern>

Pokud byste například na svém hostiteli hledali všechny procesy s názvem „bash“, spustili byste následující příkaz

$ pgrep bash

Příkaz pgrep není ve výchozím nastavení omezen na procesy vlastněné aktuálním uživatelem.

Pokud by měl příkaz bash spustit jiný uživatel, objevil by se ve výstupu příkazu pgrep.

Je také možné vyhledávat procesy pomocí globbingových znaků.

Použití příkazu pkill

Na druhou stranu je příkaz pkill také zkratkou pro příkaz ps používaný s příkazem kill.

Příkaz pkill se používá k odesílání signálu procesům na základě jejich ID nebo jejich jmen.

Syntaxe příkazu pkill je následující

$ pkill <options> <pattern>

Například, pokud chcete zabít všechna okna Firefoxu na vašem hostiteli, spustili byste následující příkaz

$ pkill firefox

Podobně jako u příkazu pgrep máte možnost zúžit výsledky zadáním uživatele pomocí volby -u.

Chcete-li zabít všechny procesy začínající na „fire“ a vlastněné aktuálním uživatelem a rootem, spusťte následující příkaz

$ pkill user,root fire*

Pokud nemáte práva k zastavení procesu, zobrazí se vám chybová zpráva o zamítnutí povolení k vašemu standardnímu výstupu.

Máte také možnost odeslat konkrétní signály zadáním čísla signálu v příkazu pkill

Chcete-li například zastavit Firefox signálem SIGSTOP, spustili byste následující příkaz

$ pkill -19 firefox

Úprava priority procesu pomocí nice a renice

V Linuxu nemají všechny procesy stejnou prioritu, pokud jde o čas CPU.

Některým procesům, jako jsou velmi důležité procesy provozované rootem, je dána vyšší priorita, aby operační systém mohl pracovat na úkolech, které jsou pro systém skutečně důležité.

Priorita procesu v systému Linux se nazývá pěkná úroveň.

Příjemná úroveň je stupnice priorit od -20 do 19.

Čím níže na stupnici zdvořilosti půjdete, tím vyšší bude priorita.

Podobně, čím výše jste na stupnici laskavosti, tím nižší bude vaše priorita.

Abyste si to zapamatovali, můžete si zapamatovat skutečnost, že „čím jste milejší, tím více jste ochotni sdílet zdroje s ostatními“.

Chcete-li spustit určitý program nebo proces s danou úrovní nice, spustíte následující příkaz

$ nice -n <level> <command>

Chcete-li například spustit příkaz tar s vlastní úrovní tar, spustili byste následující příkaz

$ nice -n 19 tar -cvf test.tar file

Podobně můžete použít příkaz renice k nastavení úrovně nice běžícího procesu na danou hodnotu.

$ renice -n <priority> <pid>

Například, pokud mám spuštěný proces s PID 123, mohu použít příkaz renice k nastavení jeho priority na danou hodnotu.

$ renice -n 18 123

Vlídnost a oprávnění

Pokud nejste členem skupiny sudo (nebo členem skupiny wheel v distribucích založených na Red Hatu), existují určitá omezení, pokud jde o to, co můžete pomocí příkazu nice.

Pro ilustraci zkuste spustit následující příkaz jako uživatel bez sudo

$ nice -n -1 tar -cvf test.tar file

nice: cannot set niceness: Permission denied

Pokud jde o slušnost, existuje jedno pravidlo, které musíte znát:

Jako uživatel bez oprávnění root (neboli sudo) nebudete moci nastavit nižší úroveň, než je výchozí přiřazená jedna (která je nula), a nebudete moci změnit běžící proces, aby nižší úroveň, než je aktuální.

Pro ilustraci posledního bodu spusťte na pozadí příkaz spánku s pěknou hodnotou 2.

$ nice -n 2 sleep 10000 &

Dále identifikujte ID procesu, který jste právě vytvořili.

Nyní zkuste nastavit hezkou úroveň vašeho procesu na hodnotu nižší než tu, kterou jste zadali na prvním místě.

$ renice -n 1 8363

Jak jste si pravděpodobně všimli, nebudete moci nastavit úroveň zpříjemnění na 1, ale pouze na hodnotu vyšší, než kterou jste zadali.

Pokud se nyní rozhodnete provést příkaz jako sudo, budete moci nastavit úroveň nice na nižší hodnotu.

Nyní, když máte jasnou představu o příkazech nice a renice, pojďme se podívat, jak můžete v Linuxu sledovat své procesy v reálném čase.

Monitorování procesů v systému Linux pomocí top a htop

V předchozím článku jsme diskutovali o tom, jak je možné vybudovat kompletní sledovací kanál za účelem monitorování linuxových procesů v reálném čase.

Používání top v systému Linux

Top je interaktivní příkaz, který může spustit každý uživatel, aby získal úplný a uspořádaný seznam všech procesů běžících na hostiteli Linux.

Chcete-li spustit top, jednoduše jej spusťte bez jakýchkoli argumentů.

Top poběží v interaktivním režimu.

$ top

Pokud chcete spustit top pro vlastní počet iterací, spusťte následující příkaz

$ top -n <number>

Příkaz top nejprve nahoře zobrazí rekapitulační statistiky o vašem systému, například počet spuštěných úloh, procento využití CPU nebo spotřebu paměti.

Přímo pod ním máte přístup k živému seznamu všech procesů běžících nebo spících na vašem hostiteli.

Toto zobrazení se obnoví každé tři sekundy, ale tento parametr samozřejmě můžete vyladit.

Chcete-li zvýšit obnovovací frekvenci v horním příkazu, stiskněte příkaz „d“ a vyberte novou obnovovací frekvenci

Podobně můžete změnit pěknou hodnotu běžícího procesu naživo stisknutím klávesy „r“ na klávesnici.

Stejná pravidla oprávnění platí, pokud chcete upravit procesy na hodnotu nižší, než je ta, která je jim již přiřazena.

V důsledku toho možná budete muset spustit příkaz jako sudo.

Používání htop v systému Linux

Případně, pokud hledáte hezčí způsob vizualizace procesů na vašem hostiteli Linuxu, můžete použít příkaz htop.

Ve výchozím nastavení není příkaz htop k dispozici na většině distribucí, takže jej budete muset nainstalovat podle následujících pokynů.

$ sudo apt-get update
$ sudo apt-get install htop

Pokud provozujete distribuci založenou na Red Hat, spusťte následující příkazy.

$ sudo yum -y install epel-release
$ sudo yum -y update
$ sudo yum -y install htop

Nakonec, chcete-li spustit příkaz htop, jednoduše jej spusťte bez jakýchkoli argumentů.

$ htop

Jak vidíte, výstup je velmi podobný, až na to, že zobrazuje informace v lidsky vstřícnějším výstupu.

Závěr

V tomto tutoriálu jste se naučili mnoho konceptů o procesech:jak jsou vytvářeny, jak je lze řídit a jak je lze efektivně monitorovat.

Pokud hledáte další návody týkající se administrace systému Linux, máme na webu kompletní sekci věnovanou tomu, takže se na ni určitě podívejte.


Linux
  1. Průvodce pochopením softwarových knihoven Linuxu v jazyce C

  2. Pochopení systémových volání na Linuxu pomocí strace

  3. Jsou vlákna implementována jako procesy v Linuxu?

  1. Pochopení systemd při startu na Linuxu

  2. Jak zabít běžící procesy v Linuxu

  3. Linuxový příkaz ps

  1. Zjistěte osiřelé procesy Linuxu

  2. Porozumění základním příkazům Linuxu

  3. Porozumění linuxové rezervaci SCSI