Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows 8
  • Vrasni proceset e panevojshme në Linux. Vrasja e proceseve në Linux - komandat ps, kill dhe killall

Vrasni proceset e panevojshme në Linux. Vrasja e proceseve në Linux - komandat ps, kill dhe killall

Sistemi operativ UNIX Robachevsky Andrey M.

ID-ja e procesit (PID)

Çdo proces ka një PID unik që lejon kernelin të bëjë dallimin midis proceseve. Kur krijohet një proces i ri, kerneli i cakton atij identifikuesin tjetër të lirë (që do të thotë, i pashoqëruar me asnjë proces). Identifikuesit caktohen në rend rritës, d.m.th. ID-ja e procesit të ri është më e madhe se id-ja e procesit të krijuar para tij. Nëse identifikuesi ka arritur vlerën maksimale, procesi tjetër do të marrë PID-in minimal të lirë dhe cikli përsëritet. Kur një proces përfundon, kerneli lëshon identifikuesin që ka zënë.

Ky tekst është një pjesë hyrëse. Nga libri Arkitektura e Sistemit Operativ UNIX autori Bach Maurice J

4.4 TRANSFORMIMI I NJË EMRI TË PËRBËRSHËM TË SKAJIT (SHTEGJA E KËRKIMIT) NË NJË ID INDEKSI Një skedar fillimisht referohet me emrin e tij të rrugës (emri i rrugës së kërkimit), si në komandat e hapura, chdir (ndryshimi i drejtorisë) ose lidhja. Meqenëse nga brenda kerneli punon me indekse dhe jo me

Nga libri Një profesion i rrallë autori Zuev Evgeny

Çfarë është një identifikues? Përveç paqartësive në sintaksë, shpejt u shfaqën telashe të tjera. Është më e vështirë t'i tregosh me shembuj, ndaj do të duhet t'i përshkruani me fjalë.Sintaksa e gjuhës C++ është e papërshtatshme edhe në një aspekt tjetër. Me pak fjalë, i drejtpërdrejtë

Nga libri Programim autor Kozlova Irina Sergeevna

11. Identifikues. Fjalë kyçe Një identifikues është një sekuencë numrash, shkronjash dhe karakteresh speciale. Në këtë rast, e para është një shkronjë ose një karakter i veçantë. Për të marrë identifikues, mund të përdorni shkronja të vogla ose të mëdha të alfabetit latin.

Nga libri 200 programet më të mira për internet. Tutorial popullor autori Krainsky I

Process Guardian XP Prodhuesi: T.A.S. Programimi i pavarur (http://www.tas-independent-programming.com). Statusi: falas. Lidhja e shkarkimit: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian. exe .Madhësia: 2.4 MB. Qëllimi kryesor i këtij programi është të menaxhojë proceset që ekzekutohen në kompjuter.

Nga libri Microsoft Visual C++ dhe MFC. Programimi për Windows 95 dhe Windows NT autor Frolov Alexander Vyacheslavovich

Hapni identifikuesin e skedarit Klasa CFile përfshin anëtarin e të dhënave m_hFile të tipit UINT. Ai ruan ID-në e skedarit të hapur. Nëse keni krijuar një objekt CFile por nuk keni hapur ende ndonjë skedar, m_hFile vendoset në konstantën hFileNull.

Nga libri UNIX: Ndërveprimi i procesit autor Stephens William Richard

ID-ja e transaksionit Një pjesë tjetër e strategjisë së afatit dhe ritransmetimit është përdorimi i ID-ve të transaksionit (ID-ja e transaksionit ose XID) për të bërë dallimin midis kërkesave të klientit dhe përgjigjeve të serverit. Kur një klient thërret një funksion RPC, biblioteka e cakton këtë

Nga libri Arkitektura TCP/IP, Protokollet, Implementimi (përfshirë versionin IP 6 dhe Sigurinë IP) autori Faith Sidney M

16.7 Vula kohore dhe ID e mesazhit Kur merrni postë, është interesante të dini se kur është dërguar dhe marrë. SMTP e shton këtë informacion në mesazhin që përcillet. Përveç kësaj, ky protokoll mban gjurmët e të gjithë hostëve që dërguan mesazhin e postës dhe kohën

Nga libri Adobe Audition 3 tutorial autor autor i panjohur

Dinamik EQ (procesi) Efekti Dynamic EQ ndryshon sasinë e filtrimit me kalimin e kohës. Për shembull, në gjysmën e parë të valës mund të rritni frekuencat e larta dhe në gjysmën e dytë mund të ndryshoni gjerësinë e gjerësisë së brezit të prekur. Dritarja Dynamic EQ ka tre skeda: Gain, Frekuenca dhe Q (gjerësia e brezit). 1. Grafiku i frekuencës (grafiku

Nga Manuali PHP i autorit

Pan/Zgjerues (procesi) Efekti Pan/Zgjeron ju lejon të zhvendosni kanalin qendror (komponentin mono) jashtë sinjalit stereo dhe të zgjeroni ose ngushtoni ndarjen stereo të kanaleve majtas dhe djathtas. Kanali qendror shtrihet duke përdorur qendrën dhe kanalet rrethuese të regjistrimit stereo,

Nga libri Zhvillimi i aplikacioneve në një mjedis Linux. Edicioni i dyte autor Johnson Michael K.

Stretch (proces) Efekti Stretch ju lejon të ndryshoni lartësinë (tonin) e një sinjali audio, tempin ose të dyja. Për shembull, mund ta përdorni këtë efekt për të rritur hapin e një pike pa ndryshuar kohëzgjatjen e tij, ose anasjelltas për të ndryshuar kohëzgjatjen pa ndryshuar

Nga libri Firebird UDHËZUES PËR ZHVILLIMIN E BAZAVE TË TË DHËNAVE autor Borri Helen

ID-ja e sesionit Pra, ID-ja e sesionit është emri i ruajtjes së përkohshme që do të përdoret për të ruajtur të dhënat e sesionit midis ekzekutimeve të skriptit. Një SID - një ruajtje. Nuk ka SID, nuk ka ruajtje dhe anasjelltas. Pra, si korrespondojnë identifikuesi dhe emri

Nga libri Sistemi Operativ UNIX autor Robachevsky Andrey M.

10.2.1. ID-ja e procesit dhe origjina Dy nga atributet më themelore janë ID-ja e procesit, ose pid, dhe ID-ja e procesit të tij mëmë. pid është një numër i plotë pozitiv që identifikohet në mënyrë unike

Nga libri i autorit

10.2.3. Uid i sistemit të skedarëve Në raste shumë të veçanta, një program mund t'i duhet të ruajë privilegjet e tij rrënjësore për çdo gjë, përveç aksesit të sistemit të skedarëve, në këtë rast ai përdor uid-in e përdoruesit. Përdorur fillimisht në serverin hapësinor Linux NFS

Nga libri i autorit

ID-ja e domenit Kur krijoni një domen në një bazë të dhënash, duhet të specifikoni një ID domeni që është unik globalisht në bazën e të dhënave. Zhvilluesit shpesh përdorin një parashtesë ose prapashtesë në identifikuesit e domenit për të përmirësuar dokumentacionin. Për shembull: KRIJO

Nga libri i autorit

Nga libri i autorit

ID-ja e procesit prind (PPID) Identifikuesi i procesit prind.

A mendoni se sistemi operativ Linux mund të kujdeset për veten automatikisht? Kur gjithçka funksionon mirë ose nuk keni nevojë për ndonjë veçori jo standarde - po. Por ndonjëherë ju mund të keni nevojë për ndërhyrjen tuaj në punën e tij.

Në Linux, për çdo program individual, krijohet një proces kur ai niset. Nuk ka rëndësi nëse e drejtoni vetë programin manualisht, apo nëse është bërë nga sistemi apo kerneli. Për shembull, programi i inicializimit që funksionon menjëherë pasi kerneli ka përfunduar ngarkimin ka gjithashtu procesin e tij me ID 0. Proceset në linux mund të përshkruhen si kontejnerë që ruajnë të gjitha informacionet rreth gjendjes dhe ekzekutimit të programit. Nëse programi funksionon mirë, atëherë gjithçka është në rregull, por nëse ngrin ose ju duhet të ndryshoni funksionimin e tij, mund t'ju duhet të menaxhoni proceset në Linux.

Ky artikull do të mbulojë një temë të gjerë, ne do të shqyrtojmë mundësi të tilla:

  • Shikoni proceset e ekzekutimit
  • Shikimi i informacionit të procesit
  • Gjetja e proceseve në Linux
  • Përfundimi i proceseve
  • Kufiri i kujtesës së procesit

Nuk mund të mos përfshija pikat e para në artikull, por ato janë shumë të thjeshta dhe ne nuk do t'i analizojmë ato në detaje. Por gjithçka tjetër mund të duket e ndërlikuar dhe e përshkruar në mënyrë të pamjaftueshme.

Le të fillojmë duke kuptuar termat. Në fakt, një proces është çdo program. Siç thashë, një proces i veçantë krijohet për çdo program të nisur. Si pjesë e procesit, programit i ndahet koha e procesorit, RAM dhe burime të tjera të sistemit. Secili proces ka identifikuesin e tij, ID-në e procesit ose thjesht PID, dhe proceset Linux më së shpeshti përcaktohen prej tyre. PID nuk përcaktohet rastësisht, siç thashë, programi i inicializimit merr PID 1, dhe çdo program i mëpasshëm ekzekutues merr një më shumë. Kështu, PID e programeve të përdoruesve tashmë arrin disa mijëra.

Në fakt, proceset Linux nuk janë aq abstrakte sa ju duken tani. Është mjaft e mundur të përpiqeni t'i ndjeni ato. Hapni menaxherin e skedarëve, lundroni në direktorinë rrënjësore dhe më pas hapni dosjen /proc. Shihni një mori numrash këtu? Pra, kjo është e gjitha - PID e të gjitha proceseve që funksionojnë. Secila prej këtyre dosjeve përmban të gjithë informacionin rreth procesit.

Për shembull, le të shohim dosjen e procesit 1. Dosja ka nëndrejtori të tjera dhe shumë skedarë. Skedari cmdline përmban informacion në lidhje me komandën për të filluar procesin:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

Meqenëse unë përdor sistemin e inicializimit Systemd, procesi i parë është nisur për të. Gjithçka mund të bëhet me drejtorinë /proc. Por kjo është shumë e papërshtatshme, veçanërisht duke marrë parasysh numrin e proceseve të ekzekutuara në sistem. Prandaj, për të zbatuar detyrat e nevojshme, ekzistojnë shërbime të veçanta. Le të kalojmë në shqyrtimin e shërbimeve që ju lejojnë të zbatoni kontrollin e procesit në Linux.

Menaxhimi i procesit Linux

Linux ka një numër shumë të madh të shërbimeve për zgjidhjen e detyrave të ndryshme të menaxhimit të procesit. Këto janë zgjidhje të tilla shumëfunksionale si htop, top, si dhe shërbime të thjeshta, për shembull, ps, kill, killall, who, etj. Unë nuk do t'i konsideroj shërbimet grafike në këtë artikull dhe nuk do t'i konsideroj as ato të para. E para është sepse është shumë e lehtë, e dyta sepse htop është më i mirë. Ne do të fokusohemi në punën me programin htop dhe homologët e tij në formën e shërbimeve të stilit GNU, një mjet, një funksion.

Le të instalojmë htop nëse nuk e keni tashmë. Në Ubuntu bëhet kështu:

sudo apt instaloni htop

Në shpërndarjet e tjera, ju vetëm duhet të përdorni menaxherin tuaj të paketave. Emri i paketës është i njëjtë.

Shikoni proceset e ekzekutimit

Kjo është një detyrë shumë e thjeshtë dhe po aq e lehtë për t'u zgjidhur. Ka shumë shërbime për këtë, duke filluar nga ps e zakonshme deri tek maja më e avancuar interaktive, htop, e kështu me radhë.

Duke hapur htop, ne menjëherë shohim një listë të proceseve që funksionojnë. Sigurisht, jo të gjitha proceset linux shfaqen këtu, ka shumë prej tyre në sistem, ju tashmë e dini, të gjitha nuk do të përshtaten në një ekran. Si parazgjedhje, shfaqen proceset që ekzekutohen si përdoruesi juaj:

Ju mund të shihni informacionin e mëposhtëm në lidhje me procesin:

  • PID- ID e procesit
  • PËRDORUESI- përdoruesi nën të cilin filloi procesi
  • PRI- Prioriteti i procesit linux në nivelin e kernelit (zakonisht NI+20)
  • N.I.- Prioriteti i ekzekutimit të procesit nga -20 në 19
  • S- gjendja e procesit
  • CPU- burimet e përdorura të procesorit
  • M.E.M.- memorie e përdorur
  • KOHA- koha e funksionimit të procesit

Parametra shtesë mund të shtohen në ekran, por këto janë ato kryesore. Mund të shtoni opsione duke përdorur menynë Setup. Gjithçka është shumë e thjeshtë, lexoni këshillat dhe ndiqni udhëzimet. Për shembull, parametri PPID shtohet:

Një veçori shumë e rëndësishme e programit është se ju mund të renditni proceset në Linux sipas parametrit të dëshiruar. Thjesht klikoni mbi emrin e parametrit, ai do të theksohet me të gjelbër dhe do të bëhet renditja. Për shembull, nëse doni të shihni se në çfarë rendi janë nisur proceset, renditni sipas PID:

Ekziston gjithashtu një mundësi interesante për të vendosur procese në formën e një peme. Ju do të jeni në gjendje të shihni se cili proces filloi një proces të caktuar. Për të shfaqur pemën, shtypni butonin F5:

Ju mund të bëni pothuajse të njëjtat gjëra me programin ps. Vetëm këtu nuk ka një mënyrë të tillë të përshtatshme interaktive. Gjithçka bëhet me opsione.

Konsideroni opsionet kryesore që do të përdorim:

  • -e- shfaq informacion për të gjitha proceset
  • -a- shfaq informacion për të gjitha proceset e kërkuara më shpesh
  • -t- tregoni vetëm proceset nga ky terminal
  • -fq- tregoni informacion vetëm për procesin e specifikuar
  • -u- tregoni vetëm proceset e një përdoruesi specifik

Me një fjalë, për të parë të gjitha proceset aktualisht aktive në Linux, përdoret një kombinim i opsioneve aux:

Programi tregon të gjithë parametrat e njëjtë, vetëm se nuk ka asnjë ndërfaqe interaktive. Ju mendoni se është e pamundur të renditni proceset këtu, por gaboheni, mundeni. Ekziston një opsion i llojit për këtë. Ju mund t'i renditni ato sipas çdo fushe, për shembull:

ps aux --sort=%mem

Lista do të renditet në rend të kundërt, vlerat janë më të mëdha në fund dhe më të vogla se në krye. Nëse është e nevojshme në rend të kundërt, shtoni një minus:

ps aux --sort=-%cpu

Prioritetet e procesit Linux ose çdo parametër tjetër mund të përdoren si fushë renditjeje. Ju gjithashtu mund të shkurtoni daljen nëse nuk dëshironi të shfaqni të gjithë informacionin:

Duket se ps nuk ka asnjë mënyrë për të përpunuar pemët me kosto. Por jo plotësisht, ekziston një komandë e veçantë për këtë:

Gjetja e proceseve në Linux

Lista e proceseve është e mirë. Por ndonjëherë, kur një proces është i ngrirë dhe ne duhet të vrasim procesin Linux ose duhet të ndërmarrim disa veprime me të, duhet të zgjedhim këtë proces nga lista, të zbulojmë PID-in e tij dhe informacionin rreth tij.

Për të gjetur procesin linux në htop, mund të përdorni tastin F3. Shtypni F3 dhe shkruani fjalën e duhur. Më pas, për të kaluar në ndodhinë tjetër, shtypni F2 ose Esc për të përfunduar kërkimin:

Ju gjithashtu mund të përdorni filtrin htop për të kërkuar procese në htop. Shtypni F4, shkruani një fjalë dhe do të listohen vetëm proceset linux emri i të cilave përfshin atë fjalë.

Nuk ka filtrim në programin ps, por ne mund të përdorim mjetin grep duke ridrejtuar daljen e ps tek ai për të gjetur procesin e linux:

ps aux | grepkromi

Kjo është një komandë shumë e përdorur.

Ndryshimi i Prioritetit të Proceseve

Prioriteti i një procesi linux nënkupton se sa më shumë kohë CPU do t'i jepet këtij procesi në krahasim me të tjerët. Në këtë mënyrë ne mund të sintonizojmë shumë mirë se cili program do të funksionojë më shpejt dhe cili do të funksionojë më ngadalë. Vlera e përparësisë mund të variojë nga 19 (përparësia minimale) në -20 - prioriteti maksimal i procesit linux. Për më tepër, ju mund të zvogëloni përparësinë me të drejtat e një përdoruesi të rregullt, por për ta rritur atë, ju nevojiten të drejtat e superpërdoruesit.

htop përdor parametrin nice për të kontrolluar prioritetin. Më lejoni t'ju kujtoj se Priv është thjesht një ndryshim, në shumicën e rasteve është më shumë se Nice me 20. Për të ndryshuar prioritetin e një procesi, thjesht vendosni kursorin mbi të dhe shtypni F7 për të ulur numrin (rrisni përparësinë) ose F8 për të rritur numrin.

Por ju nuk keni nevojë të përdorni htop për të zgjidhur këtë detyrë të menaxhimit të procesit Linux. Ju mund të bëni gjithçka me komanda të tjera. Për shembull, komanda e bukur. Me të, ju mund të specifikoni përparësinë për procesin e ekzekutimit:

nice -n 10 apt-get upgrade

Ose ndryshoni prioritetin për një tashmë ekzistues sipas pid-it të tij:

renice -n 10 -p 1343

Përfundimi i proceseve në Linux

Nëse procesi është i varur dhe nuk përgjigjet, ai duhet të ndërpritet. Në htop, për të vrarë një proces Linux, thjesht vendosni kursorin në proces dhe shtypni F9:

Sistemi përdor sinjale të caktuara për të kontrolluar proceset, ka sinjale që tregojnë që procesi të përfundojë. Këtu janë disa sinjale themelore:

  • SIGKILL- kërkoni që procesi të ruajë të dhënat dhe të përfundojë
  • SIGTERM- përfundoni procesin menjëherë pa kursim

Në përgjithësi, ka disa dhjetëra sinjale, por ne nuk do t'i konsiderojmë ato. Le të dërgojmë një sinjal SIGKILL:

Ju gjithashtu mund të përdorni mjetin kill:

Ju gjithashtu mund të vrisni një proces me emër:

vrasin kromin

Kufizimi i procesit

Menaxhimi i procesit në Linux ju lejon të kontrolloni pothuajse gjithçka. E keni parë tashmë se çfarë mund të bëhet, por mund të bëhet edhe më shumë. Me komandën ulimit dhe skedarin e konfigurimit /etc/security/limits.conf, mund të kufizoni aksesin e proceseve në burimet e sistemit si kujtesa, skedarët dhe procesori. Për shembull, mund të kufizoni kujtesën e procesit Linux, numrin e skedarëve, etj.

Hyrja në skedar duket si kjo:

<домен> <тип> <элемент> <значение>

  • domain- emri i përdoruesit, grupi ose UID
  • lloji i- lloji i kufizimeve - i butë ose i fortë
  • element- një burim që do të jetë i kufizuar
  • kuptimi- kufiri i nevojshëm

Kufijtë e vështirë vendosen nga superpërdoruesi dhe nuk mund të ndryshohen nga përdoruesit e rregullt. Limitet e buta mund të ndryshohen nga përdoruesit duke përdorur komandën ulimit.

Konsideroni kufizimet kryesore që mund të zbatohen për proceset:

  • nofile
  • si- sasia maksimale e RAM-it
  • rafte- madhësia maksimale e stivës
  • CPU- koha maksimale e procesorit
  • nproc- numri maksimal i bërthamave të procesorit
  • flokët- numri i skedarëve të bllokuar
  • bukur- prioriteti maksimal i procesit

Për shembull, le të kufizojmë kohën e procesorit për proceset e sergiy të përdoruesit:

sergiy hard nproc 20

Ju mund të shikoni kufijtë për një proces të veçantë në dosjen proc:

cat /proc/PID/kufijtë

Koha maksimale e procesorit të pakufizuar sekonda e pakufizuar
Madhësia maksimale e skedarit bajt të pakufizuar dhe të pakufizuar
Madhësia maksimale e të dhënave bajt të pakufizuar të pakufizuar
Madhësia maksimale e stivës 204800 bajt të pakufizuar
Madhësia maksimale e skedarit bazë 0 bajt të pakufizuar
Maksimumi i banorit vendos bajt të pakufizuar të pakufizuar
Proceset maksimale 23562 23562 procese
Maksimumi i skedarëve të hapur 1024 4096 skedarë
Memorie maksimale e kyçur 18446744073708503040 18446744073708503040 bajt
Hapësira maksimale e adresës, bajt e pakufizuar dhe e pakufizuar
Skedari Max bllokon bravë të pakufizuar të pakufizuar
Sinjalet maksimale në pritje 23562 23562 sinjale
Madhësia maksimale e radhës së mesazheve 819200 819200 bajt
Prioriteti maksimal i bukur 0 0
Prioriteti maksimal në kohë reale 0 0
Kohëzgjatja maksimale në kohë reale, e pakufizuar, e pakufizuar

Kufizimet e ndryshuara në këtë mënyrë do të hyjnë në fuqi pas një rindezjeje. Por ne gjithashtu mund të vendosim kufij për shell-in aktual dhe proceset që krijon me komandën ulimit.

Këtu janë opsionet e komandës:

  • -S- kufi i butë
  • -H- limit i vështirë
  • -a- shfaq të gjitha informacionet
  • -f- madhësia maksimale e skedarëve të krijuar
  • -n- numri maksimal i skedarëve të hapur
  • -s- madhësia maksimale e stivës
  • -t- sasia maksimale e kohës së procesorit
  • -u- numri maksimal i proceseve të ekzekutimit
  • -v- sasia maksimale e memories virtuale

Për shembull, ne mund të vendosim një kufi të ri për numrin e skedarëve që mund të hapen:

Tani shikojmë:

Vendosni kufirin e RAM-it:

ulimit -Sv 500000

Ju kujtoj se ky kufizim do të jetë i rëndësishëm për të gjitha programet që ekzekutohen në këtë terminal.

konkluzionet

Kjo eshte e gjitha. Tani menaxhimi i procesit në Linux nuk do t'ju shkaktojë probleme. Ne e kemi shqyrtuar këtë temë në shumë detaje. Nëse keni ndonjë pyetje ose sugjerim për të shtuar në artikull, shkruani në komente!

Ka raste kur aplikacioni fillon të dështojë, dhe bashkë me të i gjithë mjedisi i punës, natyrisht, mund të rinisni kompjuterin dhe shërbimi do të zhduket vetvetiu, por ky nuk është një opsion për të rifilluar kompjuterin tuaj çdo herë. Dhe për këtë ka një ekip Vrasin, e cila do t'ju ndihmojë të ndaloni procesin e varjes.

Ekipi Vrasin mund të përdoret për të vrarë ose përfunduar një proces duke përdorur "Signal" ose "PID". Komanda Kill dërgon sinjalin e specifikuar për të përfunduar një aplikacion që nuk sillet mirë. Nëse nuk specifikohet asnjë sinjal, dërgohet sinjali TERM. Ky sinjal TERM do të vrasë proceset që nuk e kapin atë; për procese të tjera mund të jetë e nevojshme të përdoret sinjali Kill (numri 9) pasi ky sinjal nuk mund të kapet.

SIGTERM është një sinjal që kërkon që procesi të ndalojë funksionimin. Këtij procesi i jepet pak kohë për të përfunduar punën e tij.

Epo, me sinjalin SIGKILL, ne mund ta detyrojmë procesin të përfundojë menjëherë. Dhe Programi nuk ka të drejtë ta injorojë këtë sinjal dhe e mbyll aplikacionin.

Më poshtë është formati i komandës Kill:

vrasin [ -sinjal | -s sinjal ] pid ...

Mënyra më e lehtë për të vrarë një proces është të gjesh PID-in e burimit dhe më pas të ekzekutosh PID-në si një argument për komandën Kill.

Çfarë është PID?

Çdo procesi Linux ose Unix ose programi i ekzekutueshëm i caktohet automatikisht një numër unik identifikimi i procesit (PID). PID cakton automatikisht një numër për çdo proces në sistem.

Ju mund të gjeni PID-in e një burimi duke përdorur komandën "pidof" ose komandën "ps". Për të gjetur PID-in e një procesi (le të themi firefox), përdorni komandën e mëposhtme

Pidof firefox

Ju gjithashtu mund të përdorni komandën në një formë tjetër:

Ps-A | grep -i firefox

Në shembullin e mësipërm, shfaqet numri "23814" i cili është PID i procesit firefox. Pasi PID-i i procesit (firefox) të jetë i njohur për ju, mund të përdorni komandën Kill për të vrarë procesin (firefox) siç tregohet më poshtë.

Vras 23814

Kur një komandë kryen një kill, domethënë, ajo dërgon një sinjal në proces, PID i të cilit kalohet së bashku me komandën si argument.

Për të qenë më specifik, komanda Kill ka format e mëposhtme:

  • vrasin PID
  • vrasin -15 PID
  • vrasin -9 PID
  • vras -SIGTERM PID
  • vras -SIGTERM PID

Komanda Kill ka kodet e mëposhtme të kthimit:

  • 0 - për sukses
  • 1 - dështim
  • 64 - sukses i pjesshëm (nëse specifikohet më shumë se një proces)

Një komandë tjetër që mund të përdorni është Vriti të gjithë. Killall përdor gjithashtu emrin e procesit në vend të PID dhe përfundon të gjitha rastet e procesit me atë emër. Për shembull, nëse keni disa raste të Firefox-it që funksionojnë, mund t'i përfundoni të gjitha me komandën

killall firefox

Për serverin X, ekziston një komandë tjetër e quajtur xkill, të cilat mund të vrasin proceset. Komanda Xkill është për modalitetin grafik, pa kaluar emrin e procesit ose PID-in e tij, d.m.th. nëse ekzekutoni në një terminal


Në këtë artikull, ne do të përpiqemi të krijojmë një modul kernel që mund të ndryshojë PID-në e një procesi tashmë të ekzekutuar në Linux OS, si dhe të eksperimentojmë me proceset që kanë marrë një PID të ndryshuar.


Paralajmërim: ndryshimi i PID është një proces jo standard dhe në rrethana të caktuara mund të çojë në një panik të kernelit.

Moduli ynë i testimit do të zbatojë pajisjen e karaktereve /dev/test, leximi nga i cili do të ndryshojë PID-in e procesit. Falë këtij artikulli për një shembull të zbatimit të një pajisjeje me karakter. Kodi i plotë i modulit është dhënë në fund të artikullit. Sigurisht, zgjidhja më e saktë ishte shtimi i një thirrjeje sistemi në vetë kernel, por kjo do të kërkonte rikompilimin e kernelit.

Mjedisi

Të gjitha veprimet e testimit të modulit u kryen në një makinë virtuale VirtualBox me një shpërndarje LInux 64-bit dhe versionin 4.14.4-1 të kernelit. Komunikimi me makinën u krye duke përdorur SSH.

Përpjekja numër 1 zgjidhje e thjeshtë

Disa fjalë për rrymën: ndryshorja aktuale tregon strukturën task_struct me një përshkrim të procesit në kernel (PID, UID, GID, cmdline, hapësirat e emrave, etj.)

Ideja e parë ishte thjesht ndryshimi i parametrit aktual->pid nga moduli i kernelit në atë të dëshiruar.

Static ssize_t device_read (skedari i strukturës *filp, char *buffer, madhësia_t gjatësia, loff_t * offset) ( printk("PID: %d.\n",current->pid); aktuale->pid = 1; printk("new PID: %d.\n",current->pid); , )
Për të testuar funksionalitetin e modulit, kam shkruar një program në C ++:

#përfshi #përfshi #përfshi int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>rr; std:: jashtë<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Ngarkoni modulin me komandën insmod, krijoni /dev/test dhe provoni.

# ./a.out PID prindi im 293 PID im 782 PID im i ri 782
PID nuk ka ndryshuar. Ndoshta ky nuk është i vetmi vend ku specifikohet PID.

Përpiquni #2 fusha shtesë PID

Nëse aktuale->pid nuk është një ID e procesit, atëherë çfarë është? Një vështrim i shpejtë në kodin getpid() tregoi strukturën task_struct që përshkruan procesin Linux dhe skedarin pid.c në kodin burimor të kernelit. Funksioni i kërkuar është __task_pid_nr_ns. Në kodin e funksionit, ekziston një thirrje task-> pids.pid, ne do ta ndryshojmë këtë parametër

Duke përpiluar dhe duke u përpjekur

Meqenëse testova përmes SSH, munda të merrja daljen e programit përpara se kerneli të rrëzohej:

Prindi im PID 293 PID im 1689 PID im i ri 1689
Rezultati i parë, tashmë diçka. Por PID ende nuk ka ndryshuar.

Përpjekja #3 nuk u eksportuan simbolet e kernelit

Duke parë më nga afër pid.c doli një funksion që bën atë që na nevojitet.
static void __change_pid(struct task_struct *detyra, enum pid_type type,
struct pid *i ri)
Funksioni pranon një detyrë për të cilën është e nevojshme të ndryshohet PID, lloji PID dhe, në fakt, PID i ri. Krijimi i një PID të ri trajtohet nga funksioni
struct pid *alloc_pid(structur pid_namespace *ns)

Ky funksion pranon vetëm hapësirën e emrave në të cilën do të jetë PID i ri, kjo hapësirë ​​mund të merret duke përdorur task_active_pid_ns.
Por ka një problem: këto simbole të kernelit nuk eksportohen nga kerneli dhe nuk mund të përdoren në module. E mrekullueshme më ndihmoi në zgjidhjen e këtij problemi. Nga atje merret kodi i funksionit find_sym.

Asmlinkage static void (*change_pidR)(struct task_struct *detyra, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST driver ngarkuar!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(structure file * filp, char *buffer, madhësia_t gjatësia, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(aktual)); change_pidR(aktuale ,PIDTYPE_PID,newpid); printk("PID i ri: %d.\n",current->pid); ... )
Përpiloni, ekzekutoni

Prindi im PID 299 PID im 750 PID im i ri 751
PID ndryshoi! Kerneli caktoi automatikisht një PID falas në programin tonë. Por a është e mundur të përdoret një PID që ka zënë një proces tjetër, si PID 1? Shtoni kodin pas ndarjes

Newpid->numrat.nr = 1;
Përpiloni, ekzekutoni

Prindi im PID 314 PID im 1172 PID im i ri 1
Ne marrim PID 1 të vërtetë!

Bash hedh një gabim që pengon kalimin e detyrës në komandën %n, por të gjitha funksionet e tjera funksionojnë mirë.

Karakteristikat interesante të proceseve me një PID të ndryshuar

PID 0: Nuk mund të identifikohem

Le të kthehemi te kodi dhe të ndryshojmë PID në 0.

Newpid->numrat.nr = 0;
Përpiloni, ekzekutoni

Prindi im PID284 PID im 1517 PID im i ri 0
Rezulton se PID 0 nuk është aq i veçantë? Ne gëzohemi, shkruajmë dalje dhe ...

Thelbi po bie! Kerneli e përcaktoi detyrën tonë si një DETYRË E DITËS dhe, duke parë përfundimin, thjesht u rrëzua. Me sa duket, programi ynë duhet të kthehet në PID "normale" përpara se të përfundojë.

Procesi i padukshëm

Le të kthehemi te kodi dhe të vendosim PID-in, i garantuar se nuk është i zënë
newpid->numrat.nr = 12345;

Përpiloni, ekzekutoni

Prindi im PID296 PID im 735 PID im i ri 12345
Le të shohim se çfarë ka në /proc

1148 19224288 37798693 Consoles fb kcore bllokon Ndarjet e Ndarjes Versioni 10149 2226294887 ACPI CPUInfo Filesystems Systems-Përdoruesit e Keyelësve Meminfo SCELT_DEBUG SYS VMALLOCInfo 102 15 20 23 290 5 80 88 ASOOUND-CHED-CHED-CHED FSIKE MISINFO SISTIKE MEDME MISTEMISTIKE MEDME TREGEMT modulet e kmsg scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 2312 info 28 info
Siç mund ta shihni, /proc nuk e përcakton procesin tonë, edhe nëse kemi marrë një PID falas. PID-i i mëparshëm gjithashtu nuk është në /proc, dhe kjo është shumë e çuditshme. Ndoshta ne jemi në një hapësirë ​​tjetër emrash dhe për këtë arsye nuk jemi të dukshëm në /proc. Montoni /proc-in e ri dhe shikoni se çfarë ka

1 14 18 210 25 291 738 81 9 pajisje autobusi fs kyç-përdoruesit e kyçeve të faqes tipeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 sched_debug kloo fig 8 sched_debug 21 grosch 21 swap 214g 21 faqe 49 swaptime 8 21page14g 12 16 20 226 288 4 79 85 ACPI Consoles ExecDomain vetë zoneinfo
Si më parë, procesi ynë nuk ekziston, që do të thotë se jemi në hapësirën e zakonshme të emrave. Le të kontrollojmë

Ps-e | grep bash
296 pikë/0 00:00:00 bash

Vetëm një bash, nga i cili nisëm programin. As PID-i i mëparshëm dhe as ai aktual nuk janë në listë.

Ne do t'ju tregojmë se si të vrasni një proces në Linux. Një nga avantazhet kryesore të Linux-it është aftësia për të përfunduar një proces pa pasur nevojë të rindizni serverin. Në këtë artikull, ne do t'ju tregojmë se si të vrasni një proces në Linux duke përdorur komandat kill, pkill dhe killall.

1. Çfarë është PID

Përpara se të fillojmë, duhet të dimë se çfarë është ID-ja e procesit (PID).

PID është një identifikim dixhital i procesit në. Çdo proces ka një PID unik. Në të vërtetë, për shembull, procesi i parë që fillon në një sistem të bazuar në Linux është një proces dhe PID i tij është vendosur në 1. Ky proces është prindi i të gjitha proceseve të tjera. Procesi i inicializimit nuk mund të vritet duke përdorur komandat kill, dhe kjo siguron që ai të mos vritet aksidentalisht.

Tani, në mënyrë që të gjejmë PID-in e secilit proces që funksionon në server, mund të ekzekutojmë komandën e mëposhtme:

Kjo na jep një listë të të gjitha proceseve të ekzekutuara dhe PID-ve të tyre përkatëse.

Nëse duam të gjejmë PID-in e një procesi specifik, mund të përdorim komandën pidof të ndjekur nga emri i procesit. Për shembull, për të gjetur PID-in e procesit tonë MySQL, ne mund të ekzekutojmë komandën e mëposhtme:

pidof mysql

Për më shumë detaje, ne mund të përdorim komandën ps aux së bashku me grep:

Ps aux | grep mysql

Tani që e dimë se çfarë është një PID dhe si të gjejmë PID-in e një procesi të caktuar, mund të kalojmë në seksionin tjetër dhe të mësojmë se si ta vrasim atë.

2. Vrasni një proces duke përdorur komandën kill në Linux

Ka disa rregulla të rëndësishme që duhet të dimë përpara se të fillojmë të përdorim komandën kill.

  • Ju mund të vrisni vetëm proceset e veta që janë në pronësi të ID-së tuaj të përdoruesit
  • Ju nuk mund të vrisni proceset e përdoruesve të tjerë
  • Ju nuk mund të vrisni proceset e sistemit (nëse nuk jeni superpërdorues)
  • Përdoruesi rrënjë mund të vrasë procesin e çdo përdoruesi tjetër dhe çdo proces sistemi

Kur ne vrasim një proces me komandën kill, ne në fakt po dërgojmë sinjalin specifik PID që duam të vrasim. Sinjalet e mëposhtme përdoren nga komanda kill:

1 = Mbyll telefonin 9 = Vrit 15 = Përfundo

Sinjali i pezullimit përdoret rrallë. Më shpesh përdorim sinjalin kill, dhe nëse nuk funksionon, atëherë mund të përdorim sinjalin Terminate.

Pra, pasi të gjejmë PID-in e procesit që duam të vrasim, përdorim një nga metodat që përshkruam më parë, mund të përdorim komandën vrasin -9 PID për të vrarë procesin me atë PID të veçantë.

Për shembull, nëse PID është 6738, atëherë mund të përdorim komandën e mëposhtme:

Vras -9 6738

3. Vrasni një proces duke përdorur komandën pkill në Linux

Nëse dëshironi të përdorni emrin e procesit në vend të PID të tij për ta vrarë atë, atëherë mund të përdorni komandën pkill. Për shembull, nëse procesi që duam të vrasim quhet , atëherë mund të përdorim komandën e mëposhtme për ta vrarë atë:

pkill mysql

4. Vrasni një proces duke përdorur komandën killall në Linux

Dy komandat e mëparshme përdoren për të vrarë vetëm një proces të veçantë. Por, nëse duam të vrasim një proces së bashku me të gjitha proceset e tij fëmijë, mund të përdorim komandën vriti të gjithë:

killall mysql

Në këtë shembull, ne do të vrasim procesin MySQL dhe të gjitha proceset e tij fëmijë.

Ata janë shembujt më të zakonshëm të vrasjes së procesit në Linux.

Artikujt kryesorë të lidhur