Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • OS
  • Kako ubiti proces u Linuxu. Upravljanje procesima u Linuxu Kako saznati pid Linux procesa

Kako ubiti proces u Linuxu. Upravljanje procesima u Linuxu Kako saznati pid Linux procesa

U osnovi gledamo na PID da ubijemo program koji ne reaguje i sličan je Windows Task Manageru.

Linux GUI takođe nudi istu funkciju, ali CLI je efikasan način za izvođenje operacije ukidanja.

Šta je PID ID procesa?

PID je skraćenica za identifikacioni broj procesa, koji se obično koristi u većini kernela operativnih sistema kao što su Linux, Unix, macOS i Windows.

Ovo je jedinstveni identifikacioni broj koji se automatski dodeljuje svakom procesu kada se kreira u operativnom sistemu.

Proces je izvršna instanca programa.

Svaki put, ID procesa će primiti promjene za sve procese osim init, budući da je init uvijek prvi proces u sistemu i predak svih ostalih procesa. Ovaj PID je 1.

Zadana maksimalna PID vrijednost je 32,768.

# cat/proc/sys/kernel/pid_max

Na 32-bitnim sistemima, 32768 je maksimalna vrijednost, ali možemo postaviti bilo koju vrijednost do 2^22 (otprilike 4 miliona) na 64-bitnim sistemima.

Možete pitati zašto nam treba toliko PID-ova? jer ne možemo odmah ponovo koristiti PID. Također da bi se izbjegle moguće greške.

PID za pokretanje procesa u sistemu može se pronaći pomoću sljedećih devet metoda kao što su pidof komanda, pgrep komanda, ps komanda, pstree komanda, ss komanda, netstat komanda, lsof komanda, komanda fuser i naredba systemctl.

  • pidof: pidof - pronađite ID procesa pokrenutog programa.
  • pgrep: pgre - Pretražujte ili obradite signale na osnovu imena i drugih atributa.
  • ps: ps - prijavljuje snimak trenutnih procesa.
  • pstree: pstree - prikazuje stablo procesa.
  • ss: ss se koristi za prikaz statistike utičnice.
  • netstat: netstat prikazuje listu otvorenih utičnica.
  • lsof: lsof - lista otvorenih datoteka.
  • fuser: ID-ovi procesa u listi termina svih procesa koji otvaraju jednu ili više datoteka
  • systemctl: systemctl - Upravljanje systemd sistemom i upraviteljem usluga

U ovom vodiču ćemo pogledati ID Apache procesa radi provjere.

Metod-1: Korištenje naredbe pidof

pidof se koristi za pronalaženje ID-a procesa pokrenutog programa.

Ispisuje ove identifikatore na standardni izlaz.

Da bismo to demonstrirali, saznat ćemo ID procesa Apache2 iz Debian 9 sustava.

# pidof apache2 3754 2594 2365 2364 2363 2362 2361

Iz gore navedenog, možda će vam biti teško identificirati ID procesa jer prikazuje sve PID (uključujući roditelj i dijete) s imenom procesa.

Stoga, moramo otkriti roditeljski PID (PPID) koji tražimo.

Ovo bi moglo biti broj jedan. U mom slučaju to je 3754 i prikazano je u opadajućem redoslijedu.

Metod-2: Korišćenje pgrep komande

pgrep gleda trenutne procese i navodi ID-ove procesa koji odgovaraju kriterijima odabira za stdout.

# pgrep apache2 2361 2362 2363 2364 2365 2594 3754

Ovo je također slično prethodnom izlazu, ali ovaj smanjuje rezultate uzlaznim redoslijedom, što jasno ukazuje da je roditeljski PID posljednji.

U mom slučaju to je 3754.

Bilješka. Ako imate više ID-ova procesa, možda ćete imati problema da identifikujete ID nadređenog procesa kada koristite naredbu pidof & pgrep.

Metod-3: Korišćenje pstree komande

pstree prikazuje pokrenute procese kao stablo.

Stablo je ukorijenjeno ili na pid ili na init ako je pid izostavljen.

Ako je korisničko ime navedeno u naredbi pstree, tada se prikazuje cijeli proces u vlasništvu odgovarajućeg korisnika.

pstree vizuelno kombinuje identične grane stavljajući ih u uglaste zagrade i stavljajući im prefiks sa brojem ponavljanja.

#pstree -p | grep "apache2" |- apache2(3754)-+-apache2(2361) | |-apache2(2362) | |-apache2(2363) | |-apache2(2364) | |-apache2(2365) | `-apache2(2594)

Da biste dobili samo jedan roditeljski proces, koristite sljedeći format.

#pstree -p | grep "apache2" | glava -1 |- apache2(3754)-+-apache2(2361)

Komanda pstree je vrlo jednostavna jer razdvaja roditeljske i podređene procese odvojeno

Metod-4: Korišćenje ps komande

ps prikazuje informacije o odabiru aktivnih procesa.

Prikazuje ID procesa (pid = PID), terminal povezan s procesom (tname = TTY), kumulativno CPU vrijeme u hh:mm:ss formatu (vrijeme = VRIJEME) i ime izvršne datoteke (ucmd = cmd).

Po defaultu, izlazna datoteka nije sortirana.

# ps aux | grep "apache2" www-podaci 2361 0,0 0,4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k početak www-podaci 2362 0,0 0,4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k početak www-podaci 2363 0,0 0,4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k početak www-podaci 2364 0,0 0,4 302652 9732 ? S 06:25 0:00 /usr/sbin/apache2 -k početak www-podaci 2365 0,0 0,4 302652 8400 ? S 06:25 0:00 /usr/sbin/apache2 -k početak www-podaci 2594 0,0 0,4 302652 8400 ? S 06:55 0:00 /usr/sbin/apache2 -k početak korijen 3754 0,0 1,4 302580 29324 ? Ss 11. decembar 0:23 /usr/sbin/apache2 -k početak root 5648 0.0 0.0 12784 940 pts/0 S+ 21:32 0:00 grep apache2

Iz gornjeg izlaza možemo lako identificirati ID roditeljskog procesa (PPID) na osnovu datuma početka procesa.

U mom slučaju apache2 proces je pokrenuo @Dec11 koji je roditelj, a ostali su djeca. Apache2 PID je 3754.

Metod-5: Korišćenje ss komande

ss se koristi za prikaz statistike utičnice.

Omogućava vam da prikažete informacije slične netstatu.

Može prikazati više TCP i statusnih informacija od drugih alata.

Može prikazati statistiku za sve tipove soketa kao što su PACKET, TCP, UDP, DCCP, RAW, Unix domen, itd.

# ss -tnlp | grep apache2 SLUŠAJ 0 128:::80:::* korisnici:(("apache2",pid=3319,fd=4),("apache2",pid=3318,fd=4),("apache2", pid=3317,fd=4))

Metod-6: Korištenje naredbe netstat

netstat - Prikazuje mrežne veze, tabele rutiranja, statistiku interfejsa, maskiranje i multicast veze.

Podrazumevano, netstat prikazuje listu otvorenih utičnica.

Ako ne navedete nijednu familiju adresa, bit će navedene aktivne utičnice svih konfiguriranih familija adresa.

Ovaj program je zastario. Zamjena za netstat je ss.

# netstat -tnlp | grep apache2 tcp6 0 0:::80:::* SLUŠAJ 3317/apache2

Metod-7: Korišćenje naredbe lsof

lsof - lista otvorenih datoteka.

Naredba lsof Linux prikazuje informacije o datotekama otvorenim za procese koji se pokreću na sistemu.

# lsof -i -P | grep apache2 apache2 3317 root 4u IPv6 40518 0t0 TCP *:80 (LISTEN) apache2 3318 www-data 4u IPv6 40518 0t0 TCP *:80 (LISTEN) apache2 3319 www-data 4u IPv6 40518 *:0t0 (LISTEN)

Metod-8: Korišćenje komande fuzera

Uslužni program fuzera mora u standardni izlaz zapisati ID-ove procesa procesa koji se pokreću na lokalnom sistemu koji otvaraju jednu ili više imenovanih datoteka.

# fuser -v 80/tcp KOMANDA ZA PRISTUP KORISNIČKOM PID-u 80/tcp: root 3317 F.... apache2 www-data 3318 F.... apache2 www-data 3319 F.... apache2

Metod-9: Korišćenje systemctl komande

systemctl - Upravljanje systemd sistemom i upraviteljem usluga.

Ovo je zamjena za stari sistem upravljanja SysV i Većina modernih Linux operativnih sistema je usvojila systemd.

# systemctl status apache2 ● apache2.service - Apache HTTP server Učitano: učitano (/lib/systemd/system/apache2.service; onemogućeno; unapred podešeno dobavljača: omogućeno) Drop-In: /lib/systemd/system/apache2.service. d └─apache2-systemd.conf Aktivan: aktivan (u radu) od uto 25.09.2018 10:03:28 IST; Prije 3s Proces: 3294 ExecStart=/usr/sbin/apachectl start (code=izišao, status=0/USPEH) Glavni PID: 3317 (apache2) Zadaci: 55 (ograničenje: 4915) Memorija: 7,9M CPU: 71ms CGroup: /system.slice/apache2.service ├─3317 /usr/sbin/apache2 -k start ├─3318 /usr/sbin/apache2 -k start ─3319 /usr/sbin/apache2 -k start 25. septembar 10:03:28 ubuntu systemd: Pokretanje Apache HTTP servera... 25. septembar 10:03:28 ubuntu systemd: Pokrenuo Apache HTTP server.

UNIX operativni sistem Robačevski Andrej M.

ID procesa (PID)

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

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

4.4 PRETVARANJE IMENA KOMPONENTE DATOTEKE (STATA ZA PRETRAŽIVANJE) U INDEKSNI ID Početna referenca na datoteku je po njenom kvalificiranom imenu (puta za pretraživanje), kao kod naredbi open, chdir (promjena direktorija) ili link. Zato što unutar sistema kernel radi sa indeksima, a ne sa

Iz knjige Rijetka profesija autor Zuev Evgeniy

Šta je ID? Pored nejasnoća u sintaksi, brzo su se pojavile i druge nevolje. Teže ih je prikazati na primjerima, pa ćete ih morati objasniti riječima.Sintaksa jezika C++ je također nezgodna 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, prvi znak je slovo ili poseban 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: besplatno. Link za preuzimanje: 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 nema potrebe

Iz knjige UNIX: 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 razlikovanje između zahtjeva klijenta 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 Sydney M

16.7 Vremenska oznaka i ID poruke Kada primate poštu, zanimljivo je znati vrijeme kada je poslana i primljena. SMTP dodaje ove informacije u proslijeđenu poruku. Osim toga, ovaj protokol prati sve hostove koji su prenijeli mail poruku i vrijeme

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 frekvencijskog pojasa na koji se utiče. Prozor Dynamic EQ ima tri kartice: pojačanje, frekvencija i Q (propusnost). 1. Grafikon frekvencije

Iz knjige PHP Reference autora

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

Iz knjige Razvoj aplikacija u Linux okruženju. Drugo izdanje autor Džonson Majkl K.

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

Iz knjige Firebird DATABASE DEVELOPER'S GUIDE od Borri Helen

ID sesije Dakle, ID sesije je naziv privremene memorije koja će se koristiti za pohranjivanje podataka sesije između pokretanja skripte. Jedan SID - jedno skladište. 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 porijeklo Dva najosnovnija atributa su ID procesa, ili pid, i ID njegovog nadređenog 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 privilegije za sve osim pristupa sistemu datoteka, za koji koristi korisnički uid. Prvobitno korišten u Linux NFS space serveru

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 na identifikatorima domena kako bi poboljšali dokumentaciju. Na primjer: CREATE

Iz knjige autora

Iz knjige autora

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

Postoje trenuci kada aplikacija počne da kvari, a zajedno s njom i cijelo 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 to postoji tim Ubij, što će vam pomoći da zaustavite zamrznuti proces.

Tim Ubij može se koristiti za ukidanje ili prekid procesa korištenjem “Signal” ili “PID”. 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 da se proces zaustavi. 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 pokreće automatski se dodjeljuje jedinstveni identifikacijski broj procesa (PID). PID automatski dodjeljuje broj svakom procesu u sistemu.

Možete pronaći PID resursa pomoću komande “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.

Ubijte 23814

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

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

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

Komanda Kill ima sljedeće povratne kodove:

  • 0 – na uspjeh
  • 1 – kvar
  • 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 završava sve instance procesa s tim imenom. Na primjer, ako imate više pokrenutih instanci Firefoxa, možete ih sve isključiti pomoću naredbe

Killall firefox

Za X server postoji još jedna naredba koja se zove Xkill, koji može ubiti procese. Naredba Xkill je za grafički način rada, bez prosljeđivanja naziva procesa ili njegovog PID-a, odnosno, ako pokrenete u terminalu

Danas ćemo razgovarati o tome kako se nositi s procesima u Ubuntu Linuxu koji su zamrznuti i ne možete ih prekinuti. Oni proždiru sistemske resurse tako što učitavaju sistem, jedu pristojan dio RAM-a, što stvara probleme kao što su usporavanje rada računara ili djelomično zamrzavanje sistema na kraće vremenske periode. Postoje različite situacije, nekada se zamrzava desktop, ponekad aplikacija, ponekad se zamrzava desktop okruženje, u tim situacijama ćemo tražiti izlaz kako da uradimo bez ponovnog pokretanja sistema i ne isključivanja računara pomoću dugme na sistemskoj jedinici računara jer to nije dobro rešenje.

Ponekad postoji potreba da se ubije proces u Ubuntu Linuxu, kako to učiniti ispravno i ne nanijeti štetu, razgovarat ćemo i o rješenjima konzole i kroz grafičko sučelje.

Danas ćemo razgovarati o tome kako se nositi s procesima u Ubuntu Linuxu koji su zamrznuti i ne možete ih prekinuti. Oni proždiru sistemske resurse tako što učitavaju sistem, jedu pristojan dio RAM-a, što stvara probleme kao što su usporavanje rada računara ili djelomično zamrzavanje sistema na kraće vremenske periode. Postoje različite situacije, nekad se desktop zamrzne, nekad aplikacija zamrzne, nekad se zamrzne desktop okruženje, iz ovih situacija ćemo tražiti izlaz, kako da radimo bez ponovnog pokretanja sistema i ne isključivanja računara sa dugme na sistemskoj jedinici računara jer to nije dobro rešenje.

Kada radite sa Ubuntu Linuxom, vjerovatno već imate pitanja:

Kako odrediti PID da bi se naknadno ubio proces/aplikacija

Ako ne želite da pokrenete naredbu top ili neki drugi moćniji analog htop, onda se zamarate traženjem ID-a ovog ili onog ID-a procesa, postoji lakši izlaz/rješenje da pronađete PID proces, možete koristiti naredbu " pidof" ili " PS".

Recimo da trebamo saznati ID procesa aplikacije Google Chrome, što radimo u ovoj situaciji, otvorimo terminal Ctrl + Alt + T i pokrenemo naredbu u terminalu:

Pidof chrome

dobijamo izlaz:

9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

skoro spreman, odredili smo PID, u nastavku pročitajte kako ubiti proces.

Kako ubiti proces u Linuxu pomoću PID-a

Odredili smo koji je PID u aplikaciji koju želimo da ubijemo, iz gore opisanog, vidite da sada imam mnogo kartica pokrenutih u mom pretraživaču, plus pojedinačni procesi pretraživača, ukupno ima 16 ID-ova, da ih sve ubijem , pokrećemo naredbu:

Sudo kill 9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

Također možete vidjeti sve aktivne procese u sistemu pokretanjem naredbe:

Sudo ps axu

da, tako je jednostavno. Umjesto Chromea može postojati bilo koja druga aplikacija, skype ili neka druga.

Također možete koristiti dodatnu naredbu da otkrijete ID procesa aplikacije koju želite ubiti:

Ps-A | grep -i ime-aplikacija

Umjesto name-app pišemo naziv aplikacije, ne unosite puno ime ručno, koristite auto-detekciju pomoću " tipki" TAB". Kao rezultat, ova komanda će prikazati vrijeme rada potrebnog procesa i, shodno tome, njegovo PID, koji možete koristiti za ubijanje, hajde da provjerimo rad naredbe, pokrenite u terminalu:

Ps-A | grep -i skype

dobijamo sledeći rezultat:

9257? 00:00:57 skype

sve što nam je potrebno je na dlanu, postoji ID i možemo vidjeti koliko dugo traje ovaj proces.

Kako koristiti naredbu Kill u Linuxu

Već sam gore opisao kako dobiti PID identifikator, onda sve što treba da uradimo je da koristimo ovaj PID zajedno sa kill, što će ubiti proces koji nam se ne sviđa, pogledajte detalje malo niže.

Primili smo ID i sada možemo ugasiti aplikaciju:

Sudo ubiti 9257

To je sve, aplikacija je ubijena.

Kako ubiti proces u Linuxu po imenu

Da biste ubili proces po imenu, možete koristiti naredbu killall, prvo morate razumjeti da ova naredba ubija sve procese koji imaju isto ime. Ovo je vrlo zgodno, jer u ovoj situaciji ne moramo tražiti PID procesa koji nam je potreban, na primjer, želimo zatvoriti Skype aplikaciju, izvršit ćemo naredbu u terminalu:

Sudo killall skype

također opcija:

Sudo killall -s 9 skype

u istom trenutku kada aplikacija prestane da radi, na ovaj način možete lako ubiti procese koji vam se ne sviđaju.

Komanda smrti, šta ne bi trebalo da radite u terminalu

Prethodno sam pisao materijal o lošim savjetima, koje naredbe ne treba izvršavati u terminalu da se ne ubije sistem, ali lista nije savršena i može se dopuniti sa još mnogo naredbi, od kojih ćete jednu pronaći u nastavku.

Evo primjera naredbe smrti:

Sudo ubiti -9 -1

Ova komanda će ubiti sve trenutno pokrenute procese. Ne bih preporučio da to radite jer posljedice mogu biti nepredvidive i najvjerovatnije ćete morati ponovo pokrenuti sistem bez grafičkog interfejsa. U slučaju da grafički interfejs iznenada pokvari, otvorite terminal koristeći komande CTRL+ALT+F1, svaki novi prozor se otvara po istoj analogiji, jednostavno mijenjajući F1 u F2 i tako dalje.

Također možete dobiti pomoć za gore korištene naredbe preko terminala tako što ćete pokrenuti naredbe:

Man ps man grep man pidof man kill man killall

Ovim je naš kratki materijal završen, ako nešto ne razumijete, pitajte u komentarima na materijal ispod.


U ovom članku ćemo pokušati kreirati modul kernela koji može promijeniti PID već pokrenutog procesa u Linuxu, a također ćemo 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š test modul će implementirati /dev/test karakterni uređaj, koji će promijeniti PID procesa prilikom čitanja iz njega. Hvala ovom članku za primjer implementacije karakternog uređaja. Kompletan kod modula dat je na kraju članka. Naravno, najispravnije rješenje je bilo dodavanje sistemskog poziva samom kernelu, ali to bi zahtijevalo ponovno kompajliranje kernela.

Životna sredina

Sve aktivnosti testiranja modula izvedene su u virtualnoj 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: trenutna varijabla 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 *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",trenutni->pid); , )
Da provjerim 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čitajmo modul naredbom insmod, kreiramo /dev/test i isprobamo.

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

Pokušajte #2 dodatna PID polja

Ako current->pid nije identifikator 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. U kodu funkcije postoji poziv task->pids.pid, promijenit ćemo ovaj parametar

Kompajlirajte i probajte

Pošto sam testirao preko SSH-a, uspio sam dobiti izlaz programa prije 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 simbola kernela koji se ne mogu izvesti

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

Ova funkcija prihvaća samo prostor imena u kojem će se nalaziti 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. Odličan mi je pomogao u rješavanju ovog problema. Funkcijski kod find_sym je preuzet odatle.

Statički asmlinkage void (*change_pidR)(struct task_struct *task, 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 *buffer, size_t dužina, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current) ,PIDTYPE_PID,newpid); printk("novi PID: %d.\n",trenutni->pid); ... )
Kompajlirajte, pokrenite

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 zauzet drugim procesom, kao što je PID 1? Dodajmo kod nakon alokacije

Newpid->numbers.nr = 1;
Kompajlirajte, pokrenite

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

Bash je izbacio grešku koja sprečava rad prebacivanja zadataka pomoću naredbe %n, ali sve ostale funkcije rade dobro.

Zanimljive karakteristike procesa sa promijenjenim PID-om

PID 0: ulazak ne može izaći

Vratimo se kodu i promijenimo PID na 0.

Newpid->numbers.nr = 0;
Kompajlirajte, pokrenite

Moj roditelj PID284 Moj PID 1517 Moj novi PID 0
Dakle, PID 0 nije tako poseban? Radujemo se, pišemo izlaz i...

Topovsko đule pada! Kernel je definirao naš zadatak kao IDLE TASK i, vidjevši završetak, jednostavno se srušio. Očigledno, naš program se mora vratiti na svoj "normalan" PID prije izlaska.

Nevidljivi proces

Vratimo se kodu i postavimo PID za koji je zagarantovano da neće biti zauzet
newpid->numbers.nr = 12345;

Kompajlirajte, pokrenite

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 5 sys12090 88 kao ound crypto fs ključevi misc schedstat sysrq - 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 mounts2 selfi3 thread-177 36 36 0 cgroup s dma ioports kpagecount mtrr slabinfo timer_list 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 pagetype loadavg
Kao što vidimo, /proc ne identifikuje naš proces, čak i ako smo zauzeli slobodan PID. Prethodni PID takođe nije u /proc, i ovo je veoma čudno. Možda se nalazimo u drugom imenskom prostoru i stoga nismo vidljivi glavnom /proc. Hajde da montiramo novi /proc i vidimo šta ima

1 14 18 210 25 291 738 81 9 bus uređaji fs ključ-korisnici zaključavanja pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats prekidi parti2 ključevi20 mestat9info 27 30 76 83 92 cmdline dma iomem kmsg ostalo sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz drajver ioports kpagecgroup moduli schedstat sys verzija 12 16 20 226 288 4 79 85 acpi consoles v kpagecgroup scount cinfo 1 3 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
Naš proces još uvijek ne postoji, što znači da smo u normalnom imenskom prostoru. Hajde da proverimo

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

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

Najbolji članci na ovu temu