Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 8
  • Ubijte nepotrebne procese u Linuxu. Ubijanje Linux procesa - komande ps, kill i killall

Ubijte nepotrebne procese u Linuxu. Ubijanje Linux procesa - komande ps, kill i killall

UNIX operativni sistem Robačevski Andrej M.

ID procesa ID procesa (PID)

Svaki proces ima jedinstveni PID koji omogućava kernelu da razlikuje procese. Kada se kreira novi proces, kernel mu dodeljuje sledeći slobodni (to jest, nije povezan ni sa jednim procesom) identifikator. Dodjela identifikatora je rastuća, tj. ID novog procesa je veći od ID-a procesa kreiranog prije njega. Ako je identifikator dostigao svoju maksimalnu vrijednost, sljedeći proces će dobiti minimalni slobodni PID i ciklus se ponavlja. Kada se proces završi, kernel oslobađa identifikator koji je zauzeo.

Ovaj tekst je uvodni fragment. Iz knjige Arhitektura UNIX operativnog sistema autor Bach Maurice J.

4.4 KONVERZIRANJE KOMPOZITNOG NAZVA DATOTEKE (PUTA ZA PRETRAŽIVANJE) U INDEKSNI ID Datoteci se inicijalno pristupa preko njenog složenog imena (naziv staze za pretraživanje), kao u naredbama open, chdir (promjena direktorija) ili link. Pošto interno, kernel radi sa indeksima, a ne sa

Iz knjige Rijetka profesija autor Zuev Evgeniy

Šta je identifikator? Osim sintaksnih nejasnoća, brzo su se pojavile i druge smetnje. Teže ih je prikazati na primjerima, pa morate govoriti riječima.Sintaksa jezika C++ je nezgodna i u drugom pogledu. Ukratko, direktno

Iz knjige Programiranje autor Kozlova Irina Sergeevna

11. Identifikator. Ključne riječi Identifikator je niz brojeva, slova i specijalnih znakova. U ovom slučaju, prvo je slovo ili specijalni znak. Da biste dobili identifikatore, možete koristiti mala ili velika slova latinice.

Iz knjige 200 najboljih programa za internet. Popularni tutorial autor Krainsky I

Process Guardian XP Proizvođač: T.A.S. Nezavisno programiranje (http://www.tas-independent-programming.com) Status: Free Download Link: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian exe. Veličina: 2,4 MB Glavna svrha ovog uslužnog programa je upravljanje procesima koji se pokreću na računaru.

Iz knjige Microsoft Visual C++ i MFC. Programiranje za Windows 95 i Windows NT autor Frolov Aleksandar Vjačeslavovič

Identifikator otvorenog fajla Klasa CFile uključuje element podataka m_hFile tipa UINT. Pohranjuje identifikator otvorene datoteke. Ako ste kreirali objekat klase CFile, ali još niste otvorili nijednu datoteku, tada je konstanta hFileNull upisana u m_hFile. Obično to nije potrebno

Iz UNIX knjige: Procesna komunikacija autor Stevens William Richard

ID transakcije Drugi dio strategije isteka vremena i ponovnog prijenosa je korištenje ID-ova transakcija (XID-ova) za prepoznavanje zahtjeva klijenata i odgovora servera. Kada klijent pozove RPC funkciju, biblioteka to dodjeljuje

Iz knjige TCP / IP arhitektura, protokoli, implementacija (uključujući IP verziju 6 i IP sigurnost) od Faith Sidney M

16.7 Vremenska oznaka i ID poruke Kada primite poštu, zanimljivo je znati vrijeme kada je poslana i primljena. SMTP dodaje ove informacije u proslijeđenu poruku. Osim toga, ovaj protokol vodi evidenciju o svim domaćinima koji su poslali mail poruku i vremenu

Iz knjige Adobe Audition 3 tutorial autor autor nepoznat

Dynamic EQ (proces) Efekat Dynamic EQ varira količinu filtriranja tokom vremena. Na primjer, u prvoj polovini vala možete pojačati visoke frekvencije, au drugoj polovini možete promijeniti širinu pogođenog frekvencijskog pojasa. Prozor Dynamic EQ ima tri kartice: pojačanje, frekvencija i Q (propusnost). 1. Grafikon frekvencije

Iz knjige PHP Author's Reference

Pan/Expander (proces) Pan/Expand efekat vam omogućava da pomerite središnji kanal (mono) iz stereo signala i proširite ili suzite stereo razdvajanje levog i desnog kanala. Središnji kanal se pomera pomoću centra i surround kanale stereo snimanja.

Iz knjige Razvoj aplikacija u Linuxu. Drugo izdanje autor Džonson Majkl K.

Stretch (proces) Efekat rastezanja omogućava vam da promenite visinu (visinu) audio signala, tempo ili oboje. Na primjer, možete koristiti ovaj efekat da povećate visinu fonograma bez promjene njegovog trajanja, ili obrnuto, promijenite trajanje bez promjene

Iz knjige Firebird VODIČ ZA DIZAJNER BAZE PODATAKA od Borri Helen

ID sesije Dakle, ID sesije je ime privremene memorije koja će se koristiti za pohranjivanje podataka sesije između pokretanja skripte. Jedna SID - jedna radnja. Nema SID-a, nema memorije i obrnuto. Kako su identifikator i ime povezani?

Iz knjige UNIX operativni sistem autor Robačevski Andrej M.

10.2.1. ID procesa i linija Dva najosnovnija atributa su ID procesa, ili pid, i ID njegovog roditeljskog procesa. Pid je pozitivan cijeli broj koji se jedinstveno identificira

Iz knjige autora

10.2.3. Uid sistema datoteka U vrlo posebnim slučajevima, program će možda morati zadržati svoje root dozvole za sve osim pristupa sistemu datoteka, koji koristi korisnički uid. Prvobitno korišten u Linux NFS serverskom prostoru

Iz knjige autora

ID domene Kada kreirate domenu u bazi podataka, morate navesti ID domene koji je globalno jedinstven u bazi podataka. Programeri često koriste prefiks ili sufiks u identifikatorima domene kako bi poboljšali dokumentaciju. Na primjer: CREATE

Iz knjige autora

Iz knjige autora

ID roditeljskog procesa (PPID) Identifikator procesa koji je ovo pokrenuo

Mislite li da se Linux operativni sistem može automatski pobrinuti za sebe? Kada sve radi kako treba ili vam ne trebaju nikakve nestandardne funkcije, da. Ali ponekad može biti potrebna vaša intervencija u njenom radu.

U Linuxu se za svaki pojedinačni program kreira proces kada se pokrene. Nije važno da li sami pokrećete program ručno ili to radi sistem ili kernel. Na primjer, program za inicijalizaciju, koji se pokreće odmah nakon što je kernel završio učitavanje, također ima svoj vlastiti proces sa identifikatorom 0. Procesi u linuxu se mogu opisati kao kontejneri u kojima se pohranjuju sve informacije o stanju i izvršavanju programa. . Ako program dobro radi, onda je sve u redu, ali ako visi ili ga trebate konfigurirati da radi, možda ćete morati upravljati procesima u Linuxu.

Ovaj članak će pokriti opsežnu temu, razmotrit ćemo sljedeće mogućnosti:

  • Pogledajte pokrenute procese
  • Pregled informacija o procesima
  • Pronalaženje procesa u Linuxu
  • Završetak procesa
  • Ograničavanje memorije dostupne procesu

Nisam mogao a da ne uključim prve tačke u članak, ali one su vrlo jednostavne i nećemo ih detaljno analizirati. Ali sve ostalo može izgledati komplikovano i nedovoljno opisano.

Počnimo s razumijevanjem pojmova. U osnovi, proces je svaki program. Kao što sam rekao, poseban proces se kreira za svaki program koji se pokrene. Kao dio procesa, programu se dodjeljuje procesorsko vrijeme, RAM i drugi sistemski resursi. Svaki proces ima svoj identifikator, ID procesa ili jednostavno PID, a najčešće su Linux procesi određeni njima. PID nije određen slučajno, kao što sam već rekao, program za inicijalizaciju dobija PID 1, a svaki sledeći program koji se pokrene dobija još jedan. Dakle, PID korisničkih programa već dostiže nekoliko hiljada.

U stvari, Linux procesi nisu tako apstraktni kako vam se sada čine. Sasvim je moguće pokušati ih dodirnuti. Otvorite svoj upravitelj datoteka, idite u korijenski direktorij, a zatim otvorite / proc folder. Vidite li ovdje gomilu brojeva? Dakle, to je sve - PID svih pokrenutih procesa. Svaki od ovih foldera sadrži sve informacije o procesu.

Na primjer, pogledajmo mapu procesa 1. Postoje drugi pod direktorijima i puno datoteka u folderu. Datoteka cmdline sadrži informacije o naredbi za pokretanje procesa:

cat / proc / 1 / cmdline

/ usr / lib / systemd / systemd

Pošto koristim Systemd init sistem, za njega se pokreće prvi proces. Sve se može uraditi sa / proc direktorijumom. Ali ovo je vrlo nezgodno, posebno s obzirom na broj pokrenutih procesa na sistemu. Stoga postoje posebni uslužni programi za implementaciju potrebnih zadataka. Pređimo na pregled uslužnih programa koji vam omogućavaju implementaciju kontrole procesa u Linuxu.

Linux kontrola procesa

Linux ima vrlo veliki broj uslužnih programa za rješavanje različitih zadataka upravljanja procesima. To su takva multifunkcionalna rješenja kao što su htop, top, kao i jednostavni uslužni programi, na primjer, ps, kill, killall, who itd. U ovom članku neću razmatrati grafičke uslužne programe, a neću ni top. Prvi je zato što je previše jednostavan, drugi zato što je htop bolji. Fokusiraćemo se na rad sa htop-om i njegovim uslužnim kolegama u GNU stilu, jedan pomoćni program jedna funkcija.

Hajde da instaliramo htop ako ga već nemate. Ubuntu to radi ovako:

sudo apt install htop

U drugim distribucijama, samo trebate koristiti svoj upravitelj paketa. Naziv paketa je isti.

Pogledajte pokrenute procese

Ovo je vrlo jednostavan zadatak, a također ga je lako riješiti. Postoji mnogo uslužnih programa za ovo, od običnog ps do naprednijih interaktivnih top, htop i tako dalje.

Otvarajući htop, odmah vidimo listu pokrenutih procesa. Naravno, nisu svi linux procesi prikazani ovdje, ima ih puno u sistemu, znate već, neće svi stati na jedan ekran. Prema zadanim postavkama, procesi pokrenuti kao vaš korisnik su navedeni:

Možete vidjeti sljedeće informacije o procesu:

  • PID- ID procesa
  • KORISNIK- korisnik od kojeg je proces pokrenut
  • PRI- prioritet linux procesa na nivou kernela (obično NI + 20)
  • NI- prioritet izvršenja procesa od -20 do 19
  • S- stanje procesa
  • Cpu- iskorišteni procesorski resursi
  • MEM- iskorištena memorija
  • VRIJEME- vrijeme obrade

Možete dodati dodatne parametre na ekran, ali ovo su glavni. Možete dodati parametre pomoću menija Setup. Tamo je sve vrlo jednostavno, pročitajte savjete i slijedite upute. Na primjer, dodan je PPID parametar:

Vrlo važna karakteristika programa je da možete sortirati procese u Linuxu prema željenom parametru. Samo kliknite na naziv parametra, on će biti označen zelenom bojom i sortiranje će biti izvršeno. Na primjer, ako želite vidjeti kojim redoslijedom su pokrenuti procesi, sortirajte po PID-u:

Postoji i zanimljiva prilika da se procesi rasporede u obliku stabla. Moći ćete vidjeti koji je proces pokrenuo ovaj ili onaj proces. Pritisnite F5 za prikaz stabla:

Istu stvar možete učiniti i sa ps-om. Samo ovdje ne postoji tako zgodan interaktivni način rada. Sve se radi sa opcijama.

Razmotrimo glavne opcije koje ćemo koristiti:

  • -e- prikaz informacija o svim procesima
  • -a- prikaz informacija o svim najčešće traženim procesima
  • -t- prikazuje samo procese sa ovog terminala
  • -p- prikazuje informacije samo o navedenom procesu
  • -u- prikazati procese samo određenog korisnika

Ukratko, za pregled svih trenutno aktivnih procesa u linuxu koristi se kombinacija aux opcija:

Program pokazuje sve iste parametre, samo što nema interaktivnog interfejsa. Mislite da je nemoguće sortirati procese ovdje, ali varate se, možete. Za ovo postoji opcija sortiranja. Možete ih sortirati po bilo kojem polju, na primjer:

ps aux --sort =% mem

Lista će biti sortirana obrnutim redoslijedom, s više vrijednosti na dnu i manje na vrhu. Ako je potrebno obrnutim redoslijedom, dodajte minus:

ps aux --sort = -% cpu

Prioriteti Linux procesa ili bilo koji drugi parametri mogu se koristiti kao polje za sortiranje. Također možete skratiti izlaz ako ne trebate prikazati sve informacije:

Čini se da ps nema načina za obračunavanje troška procesnih stabala. Ali ne baš, postoji posebna komanda za ovo:

Pronalaženje procesa u Linuxu

Lista procesa je dobra. Ali ponekad, kada proces visi i moramo ubiti Linux proces ili moramo izvršiti neku radnju s njim, moramo odabrati ovaj proces sa liste, saznati njegov PID i informacije o njemu.

Možete koristiti tipku F3 da pronađete linux proces u htop-u. Pritisnite F3 i unesite željenu riječ. Zatim, da pređete na sljedeće pojavljivanje, pritisnite F2 ili Esc da dovršite pretragu:

Također možete koristiti htop filter da pronađete procese u htopu. Pritisnite F4, unesite riječ i biće prikazani samo linux procesi čije ime uključuje ovu riječ.

Nema filtriranja u ps-u, ali možemo koristiti grep tako što ćemo preusmjeriti ps izlaz na njega da pronađemo linux proces:

ps aux | grep hrom

Ovo je vrlo često korištena naredba.

Promjena prioriteta procesa

Prioritet linux procesa znači koliko će više CPU vremena biti posvećeno ovom procesu u odnosu na druge. Tako možemo vrlo fino podesiti koji će program raditi brže, a koji sporije. Vrijednost prioriteta može biti u rasponu od 19 (minimalni prioritet) do -20 - maksimalni prioritet linux procesa. Štaviše, možete smanjiti prioritet sa pravima običnog korisnika, ali da biste ga povećali, potrebna su vam prava superkorisnika.

Htop koristi parametar Nice za kontrolu prioriteta. Da vas podsjetim da je Priv samo amandman, u većini slučajeva je više od Nice za 20. Da biste promijenili prioritet procesa, jednostavno postavite kursor na njega i pritisnite F7 da smanjite broj (povećajte prioritet) ili F8 da povećate broj.

Ali ne morate koristiti htop ni za ovaj zadatak kontrole Linux procesa. Sve možete učiniti drugim komandama. Na primjer, lijepa naredba. Koristeći ga, možete odrediti prioritet za započeti proces:

nice -n 10 apt-get upgrade

Ili promijenite prioritet za postojeći po njegovom pid-u:

renice -n 10 -p 1343

Završetak procesa u Linuxu

Ako je proces zamrznut i ne reagira, mora se prekinuti. U htop-u, da biste ubili Linux proces, jednostavno postavite kursor preko procesa i pritisnite F9:

Sistem koristi određene signale za kontrolu procesa, postoje signali koji ukazuju na završetak procesa. Evo nekoliko osnovnih signala:

  • SIGKILL- zatražite od procesa da sačuva podatke i završi
  • SIGTERM- završite proces odmah, bez spremanja

Općenito, postoji nekoliko desetina signala, ali ih nećemo razmatrati. Pošaljimo SIGKILL signal:

Također možete koristiti uslužni program kill:

Također možete ubiti proces po imenu:

killall hrom

Ograničavanje procesa

Linux kontrola procesa vam omogućava da kontrolišete gotovo sve. Već ste vidjeli šta se može učiniti, ali može se učiniti više. Sa naredbom ulimit i konfiguracijskom datotekom /etc/security/limits.conf, možete ograničiti procesima pristup sistemskim resursima kao što su memorija, datoteke i procesor. Na primjer, možete ograničiti memoriju Linux procesa, broj datoteka itd.

Unos fajla izgleda ovako:

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

  • domena- korisničko ime, naziv grupe ili UID
  • tip- vrsta ograničenja - meka ili tvrda
  • element- resurs koji će biti ograničen
  • značenje- traženi limit

Čvrsta ograničenja postavlja superkorisnik i obični korisnici ih ne mogu mijenjati. Meke, meke granice korisnici mogu promijeniti pomoću naredbe ulimit.

Razmotrimo glavna ograničenja koja se mogu primijeniti na procese:

  • nema dokumenta
  • as- maksimalna količina RAM-a
  • stog- maksimalna veličina steka
  • cpu- maksimalno vreme procesora
  • nproc- maksimalan broj procesorskih jezgara
  • brave- broj zaključanih datoteka
  • lijepo- maksimalni prioritet procesa

Na primjer, ograničimo vrijeme procesora za procese korisnika sergiy:

sergiy hard nproc 20

Možete pogledati ograničenja za određeni proces u proc folderu:

cat / proc / PID / limits

Maksimalno CPU vrijeme neograničeno neograničeno sekundama
Maksimalna veličina datoteke neograničeno neograničeno bajtova
Maksimalna veličina podataka neograničena neograničena broj bajtova
Maksimalna veličina steka 204800 neograničenih bajtova
Maksimalna veličina datoteke jezgre 0 neograničenih bajtova
Maksimalni rezidentni set neograničen neograničen broj bajtova
Maks. procesa 23562 23562 procesa
Maksimalni broj otvorenih datoteka 1024 4096 datoteka
Maksimalna zaključana memorija 18446744073708503040 18446744073708503040 bajtova
Maksimalni adresni prostor neograničen neograničen broj bajtova
Maksimalni broj zaključavanja datoteka neograničeno neograničeno zaključavanje
Maks. signala na čekanju 23562 23562 signala
Maksimalna veličina reda poruka 819200 819200 bajtova
Maksimalni lijep prioritet 0 0
Maksimalni prioritet u realnom vremenu 0 0
Maksimalno vremensko ograničenje u realnom vremenu neograničeno neograničeno nas

Ovako promijenjena ograničenja stupit će na snagu nakon ponovnog pokretanja. Ali također možemo postaviti ograničenja za trenutnu ljusku i procese koje kreira pomoću naredbe ulimit.

Evo opcija komandi:

  • -S- meko ograničenje
  • -H- tvrdo ograničenje
  • -a- prikaz svih informacija
  • -f- maksimalna veličina kreiranih datoteka
  • -n- maksimalan broj otvorenih datoteka
  • -s- maksimalna veličina steka
  • -t- maksimalna količina vremena procesora
  • -u- maksimalan broj pokrenutih procesa
  • -v- maksimalna količina virtuelne memorije

Na primjer, možemo postaviti novo ograničenje broja datoteka koje se mogu otvoriti:

Sada gledamo:

Postavimo ograničenje RAM-a:

ulimit -Sv 500000

Da vas podsjetim da će ovo ograničenje biti relevantno za sve programe koji se pokreću u ovom terminalu.

zaključci

To je sve. Sada vam upravljanje procesima u Linuxu neće praviti probleme. Ovu temu smo razmotrili veoma detaljno. Ako imate pitanja ili prijedloga za dopunu članka, pišite u komentarima!

Ima trenutaka kada aplikacija počne da kvari, a sa njom i čitavo radno okruženje, naravno, možete ponovo pokrenuti računar, a sama servisabilnost će nestati, ali ovo nije opcija da ponovo pokrenete računar svaki put. I za ovo postoji komanda Ubij da vam pomogne da zaustavite zamrznuti proces.

Tim Ubij može se koristiti za ukidanje ili prekid procesa korištenjem “Signala” ili “PID-a”. Komanda Kill šalje specificirani signal za prekid aplikacije koja se loše ponaša. Ako signal nije specificiran, šalje se TERM signal. Ovaj TERM signal će ubiti procese koji ga ne uhvate; za druge procese može biti potrebno koristiti Kill signal (broj 9), jer se ovaj signal ne može presresti.

SIGTERM je signal koji zahtijeva zaustavljanje procesa. Ovom procesu je dato određeno vrijeme da završi svoj posao.

Pa, uz pomoć signala SIGKILL, možemo prisiliti da se proces odmah prekine. I Program nema pravo ignorirati ovaj signal i ukida aplikaciju.

Sledeći je format naredbe Kill:

kill [-signal | -s signal] pid ...

Najlakši način da prekinete proces je da pronađete PID resursa i zatim pokrenete PID kao argument sa naredbom Kill.

Šta je PID?

Svakom Linux ili Unix procesu ili programu koji se izvršava automatski se dodjeljuje jedinstveni identifikacijski broj procesa (PID). PID automatski dodjeljuje broj svakom procesu u sistemu.

Možete pronaći PID resursa pomoću naredbe “pidof” ili “ps”. Da biste saznali PID procesa (recimo firefox) koristite sljedeću naredbu

Pidof firefox

Naredbu možete koristiti i u drugom obliku:

Ps -A | grep -i firefox

U gornjem primjeru, prikazan je broj “23814” koji je PID firefox procesa. Kada saznate PID procesa (firefox), možete koristiti naredbu Kill da biste ubili proces (Firefox) kao što je prikazano ispod.

Ubij 23814

Kada naredba izvrši destrukciju, to jest, šalje signal procesu čiji se PID prosljeđuje zajedno sa naredbom kao argument.

Da budemo precizniji, naredba Kill ima sljedeće oblike:

  • ubiti PID
  • ubiti -15 PID
  • ubiti -9 PID
  • kill -SIGTERM PID
  • kill -SIGTERM PID

Komanda Kill ima sljedeće povratne kodove:

  • 0 - na uspjeh
  • 1 - neuspjeh
  • 64 - djelomični uspjeh (ako je navedeno više od jednog procesa)

Druga komanda koju možete koristiti je KillAll... Killall također koristi ime procesa umjesto PID-a i ubija sve instance procesa s tim imenom. Na primjer, ako ste pokrenuli više instanci Firefoxa, možete ih sve prekinuti naredbom

Killall firefox

Za X server postoji još jedna naredba koja se zove Xkill koji mogu ubiti procese. Naredba Xkill je za grafički način rada, bez prolaska kroz naziv procesa ili PID, odnosno ako pokrenete u terminalu


U ovom članku ćemo pokušati kreirati modul kernela koji može promijeniti PID već pokrenutog procesa u Linuxu, kao i eksperimentirati s procesima koji su primili promijenjeni PID.


Upozorenje: Promjena PID-a je nestandardan proces i pod određenim okolnostima može dovesti do panike kernela.

Naša jedinica za testiranje će implementirati karakterni uređaj / dev / test, koji će promijeniti PID procesa kada se čita iz. Za primjer implementacije karakternog uređaja, hvala ovom članku. Kompletan kod modula dat je na kraju članka. Naravno, najispravnije rešenje je bilo dodavanje sistemskog poziva samom kernelu, ali to bi zahtevalo rekompilaciju kernela.

Životna sredina

Sve radnje za testiranje modula izvedene su u virtuelnoj mašini VirtualBox sa 64-bitnom Linux distribucijom i verzijom kernela 4.14.4-1. Komunikacija sa mašinom je obavljena pomoću SSH.

Pokušaj #1 jednostavno rješenje

Nekoliko riječi o struji: varijabla current ukazuje na strukturu task_struct sa opisom procesa u kernelu (PID, UID, GID, cmdline, imenski prostori, itd.)

Prva ideja je bila jednostavno promijeniti parametar current-> pid iz modula kernela u željeni.

Statički ssize_t device_read (struct file * filp, char * bafer, size_t dužina, loff_t * offset) (printk ("PID:% d. \ N", trenutni-> pid); current-> pid = 1; printk ("novi PID:% d. \ N ", struja-> pid);,)
Da testiram funkcionalnost modula, napisao sam program na C ++:

#include #include #include 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 >> str; std :: cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Učitajte modul sa insmodom, kreirajte / dev / test i isprobajte.

# ./a.out Moj roditelj PID 293 Moj PID 782 Moj novi PID 782
PID se nije promijenio. Ovo možda nije jedino mjesto gdje je PID naveden.

Pokušajte #2 dodatna PID polja

Ako current-> pid nije ID procesa, šta je onda? Brzi pogled na getpid () kod ukazao je na strukturu task_struct koja opisuje Linux proces i pid.c datoteku u izvornom kodu kernela. Potrebna funkcija je __task_pid_nr_ns. Kod funkcije sadrži poziv task-> pids.pid, promijenit ćemo ovaj parametar

Sastavljanje, pokušaj

Pošto sam testirao preko SSH-a, uspeo sam da dobijem izlaz programa pre nego što se kernel sruši:

Moj roditelj PID 293 Moj PID 1689 Moj novi PID 1689
Prvi rezultat je već nešto. Ali PID se još uvijek nije promijenio.

Pokušaj #3 neizvezenih simbola kernela

Pažljiviji pogled na pid.c dao je funkciju koja radi ono što želimo.
static void __change_pid (struct task_struct * zadatak, enum tip pid_type,
struct pid * novo)
Funkcija prihvaća zadatak za koji je potrebno promijeniti PID, tip PID-a i, zapravo, novi PID. Novi PID kreira funkcija
struct pid * alloc_pid (struct pid_namespace * ns)

Ova funkcija prihvata samo prostor imena u kojem će biti novi PID, ovaj prostor se može dobiti pomoću task_active_pid_ns.
Ali postoji jedan problem: kernel ne izvozi ove simbole kernela i ne mogu se koristiti u modulima. U rješavanju ovog problema pomogao mi je jedan divan. Funkcijski kod find_sym je preuzet odatle.

Statički asmlinkage void (* change_pidR) (struct task_struct * zadatak, enum pid_type type, struct pid * pid); statički asmlinkage struct pid * (* alloc_pidR) (struct pid_namespace * ns); static int __init test_init (void) (printk (KERN_ALERT "TEST drajver je učitan! \ n"); change_pidR = find_sym ("change_pid"); alloc_pidR = find_sym ("alloc_pid"); ...) static ssize_t device_read (struct file * filp, char * bafer, dužina size_t, loff_t * pomak) (printk ("PID:% d. \ n", trenutni-> pid); struct pid * newpid; newpid = alloc_pidR (task_active_pid_ns (trenutni)); change_pidR (trenutni) , PIDTYPE_PID, newpid); printk ("novi PID:% d. \ N", trenutni-> pid); ...)
Kompliment, lansiranje

Moj roditelj PID 299 Moj PID 750 Moj novi PID 751
PID promijenjen! Kernel je automatski dodijelio besplatni PID našem programu. Ali da li je moguće koristiti PID koji je preuzeo drugi proces, kao što je PID 1? Dodajte kod nakon dodjele

Newpid-> numbers.nr = 1;
Kompliment, lansiranje

Moj roditelj PID 314 Moj PID 1172 Moj novi PID 1
Dobijamo pravi PID 1!

Bash je dao grešku gdje uključivanje zadataka na komandu% n neće raditi, ali sve ostale funkcije rade dobro.

Zanimljive karakteristike procesa sa promijenjenim PID-om

PID 0: ne može se izaći iz unosa

Vratimo se kodu i promijenimo PID na 0.

Newpid-> numbers.nr = 0;
Kompliment, lansiranje

Moj roditelj PID284 Moj PID 1517 Moj novi PID 0
Dakle, PID 0 nije tako poseban? Sretni smo, napišite izlaz i...

Jezgro pada! Kernel je definirao naš zadatak kao IDLE TASK i kada je vidio završetak samo se srušio. Očigledno, prije završetka, naš program bi trebao vratiti sebi "normalni" PID.

Nevidljivi proces

Vratimo se kodu i podesimo PID, za koji je zagarantovano da nije zauzet
newpid-> numbers.nr = 12345;

Kompliment, lansiranje

Moj roditelj PID296 Moj PID 735 Moj novi PID 12345
Hajde da vidimo šta je u /proc

1 148 19 224 288 37 79 86 93 konzole fb kcore brave particije zamjene verzija 10 149 2 226 29 4 8 87 acpi cpuinfo sistemi datoteka ključ-korisnici meminfo sched_debug sys102c kripta sys102c kripta sys10208 okidač vmstat 11 16 208 24 291 6 81 89 buddyinfo uređaji prekidaju kmsg module scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts13 self thread-self36 kgroup 7 thread-17info 139 18 22 27 30 76 84 91 cmdline drajver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat up
Kao što vidite, /proc ne definira naš proces, čak i ako smo pozajmili besplatni PID. Prethodni PID takođe nije u / proc, što je vrlo čudno. Možda smo u drugom imenskom prostoru i stoga nismo vidljivi glavnom / proc. Hajde da montiramo novi /proc i vidimo šta je unutra

1 14 18 210 25 291 738 81 9 autobus uređaje FS ključnim korisnicima brave pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats prekida ključeve meminfo particije stat tty 102 149 19 222 27 30 76 83 92 cmdline DMA iomem kmsg misc sched_debug swaps vrlo nervozan 11 15 2 224 28 37 78 84 93 config.gz vozač ioports kpagecgroup modula schedstat sys verzija 12 16 20 226 288 4 79 85 acpi konzole execdomains irq kpagecount nosače SCSI SysRq-okidač vmallocinfo 13 17 208 23 29 6 8 86 asound cpuinfo fb ​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kripto datotečni sistemi kcore loadavg net slabinfo thread-self zoneinfo
Kao i ranije, naš proces nije tu, što znači da smo u redovnom imenskom prostoru. Provjeri

Ps -e | grep bash
296 poena / 0 00:00:00 bash

Samo jedan bash, iz kojeg smo pokrenuli program. Ni prethodni PID ni trenutni nisu na listi.

Pokazat ćemo vam kako ubiti proces u Linuxu. Jedna od glavnih prednosti Linuxa je mogućnost dovršetka procesa bez ponovnog pokretanja servera. U ovom članku ćemo vam pokazati kako ubiti proces u Linuxu pomoću naredbi kill, pkill i killall.

1. Šta je PID

Prije nego što počnemo, moramo znati šta je ID procesa (PID).

PID je digitalna identifikacija procesa u. Svaki proces ima jedinstveni PID. Zaista, na primjer, prvi proces koji se pokreće na sistemu zasnovanom na Linuxu je proces, a njegov PID je postavljen na 1. Ovaj proces je roditelj svih ostalih procesa. Init proces ne može biti ubijen naredbama kill, a to osigurava da se ne ubije slučajno.

Sada, da bismo pronašli PID svakog pokrenutog procesa na serveru, možemo pokrenuti sljedeću naredbu:

Ovo nam daje listu svih pokrenutih procesa i njihovih odgovarajućih PID-ova.

Ako želimo pronaći PID određenog procesa, možemo koristiti naredbu pidof iza koje slijedi ime procesa. Na primjer, da biste saznali PID našeg MySQL procesa, možete pokrenuti sljedeću naredbu:

Pidof mysql

Za još više detalja možemo koristiti naredbu ps aux zajedno sa grep:

Ps aux | grep mysql

Sada kada znamo šta je PID i kako pronaći PID određenog procesa, možemo prijeći na sljedeći odjeljak i saznati kako ga ubiti.

2. Ukinite proces koristeći naredbu kill u Linuxu

Postoji nekoliko važnih pravila koja moramo znati prije upotrebe naredbe kill.

  • Možete ubiti samo svoje vlastite procese koji su u vlasništvu vašeg korisničkog ID-a
  • Ne možete ubiti procese drugih korisnika
  • Ne možete ubiti sistemske procese (osim ako niste superkorisnik)
  • Root korisnik može ubiti proces bilo kojeg drugog korisnika i bilo koji sistemski proces

Kada prekinemo proces naredbom kill, mi zapravo šaljemo određeni signal PID kontroleru koji želimo ubiti. Naredba kill koristi sljedeće signale:

1 = prekinuti vezu 9 = ubiti 15 = prekinuti

Signal za prekid veze se rijetko koristi. Najčešće koristimo kill signal, a ako ne radi onda možemo koristiti signal Terminate.

Stoga, kada pronađemo PID procesa koji želimo ubiti, upotrijebite jednu od metoda koje smo ranije opisali, možemo koristiti naredbu ubiti -9 PID da ubije proces iz tog određenog PID-a.

Na primjer, ako je PID 6738, onda možemo koristiti sljedeću naredbu:

Ubiti -9 6738

3. Ukinite proces naredbom pkill u Linuxu

Ako želite da koristite ime procesa umjesto njegovog PID-a da ga ubijete, onda možete koristiti naredbu pkill. Na primjer, ako se pozove proces koji želimo ubiti, onda možemo koristiti sljedeću naredbu da ga ubijemo:

Pkill mysql

4. Ukinite proces koristeći naredbu killall u Linuxu

Prethodne dvije naredbe se koriste za ukidanje samo jednog specifičnog procesa. Ali, ako želimo da ubijemo proces zajedno sa svim njegovim podređenim procesima, možemo koristiti naredbu killall:

Killall mysql

U ovom primjeru, mi ćemo ubiti MySQL proces i sve njegove podređene procese.

Ovo su najčešći primjeri ubijanja procesa u Linuxu.

Top srodni članci