Kako ubiti proces u Linuxu. Upravljanje procesima u Linuxu


U ovom ćemo članku pokušati stvoriti modul jezgre 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 nestandardni proces i pod određenim okolnostima može dovesti do panike kernela.

Naš testni modul implementirat će /dev/test znakovni uređaj, koji će promijeniti PID procesa prilikom čitanja s njega. Hvala ovom članku na primjeru implementacije znakovnog uređaja. Cijeli kod modula dan je na kraju članka. Naravno, najispravnije rješenje bilo je dodati sistemski poziv u sam kernel, ali to će zahtijevati ponovno kompajliranje kernela.

Okoliš

Sve aktivnosti testiranja modula obavljene su virtualno VirtualBox stroj sa 64-bitnom distribucijom LInuxa i verzijom jezgre 4.14.4-1. Komunikacija sa strojem se odvijala pomoću SSH.

Pokušaj #1 jednostavno rješenje

Nekoliko riječi o struji: trenutna varijabla ukazuje na strukturu task_struct s opisom procesa u kernelu (PID, UID, GID, cmdline, namespaces, itd.)

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

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",trenutni->pid); , )
Kako bih provjerio funkcionalnost modula, napisao sam program u C++:

#uključi #uključi #uključi 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 s insmod naredbom, stvorimo /dev/test i isprobajmo.

# ./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 naveden PID.

Pokušaj #2 dodatnih PID polja

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

Sastavite i pokušajte

Budući da sam testirao putem SSH-a, uspio sam dobiti izlaz programa prije nego što se kernel srušio:

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 simboli kernela koji se ne mogu izvoziti

Pažljiviji pogled na pid.c dao je funkciju koja radi ono što nam treba
static void __change_pid(struct task_struct *task, enum pid_type tip,
struct pid *novo)
Funkcija prihvaća zadatak za koji je potrebno promijeniti PID, vrstu PID-a i zapravo novi PID. Funkcija stvara 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: ove simbole kernela ne izvozi kernel i ne mogu se koristiti u modulima. Prekrasan mi je pomogao u rješavanju ovog problema. Kôd funkcije find_sym preuzet je od tamo.

Static asmlinkage void (*change_pidR)(struct task_struct *task, 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 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 length, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(trenutni ,PIDTYPE_PID,newpid); printk("novi PID: %d.\n",trenutni->pid); ... )
Prevedi, pokreni

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

Newpid->brojevi.nr = 1;
Prevedi, pokreni

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

Bash je izbacio bug koji sprječava rad prebacivanja zadataka pomoću naredbe %n, ali sve ostale funkcije rade dobro.

Zanimljive značajke procesa s promijenjenim PID-om

PID 0: ulaz ne može izaći

Vratimo se kodu i promijenimo PID na 0.

Newpid->brojevi.nr = 0;
Prevedi, pokreni

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 "normalni" PID prije izlaska.

Nevidljivi proces

Vratimo se kodu i postavimo PID koji zajamčeno neće biti zauzet
novipid->brojevi.nr = 12345;

Prevedi, pokreni

Moj roditelj PID296 Moj PID 735 Moj novi PID 12345
Da vidimo što je u /proc

1 148 19 224 288 37 79 86 93 konzole fb kcore zaključava particije swaps verzija 10 149 2 226 29 4 8 87 acpi cpuinfo datotečni sustavi ključni korisnici meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 8 8 kao ound crypto fs ključevi misc schedstat sysrq - okidač vmstat 11 16 208 24 291 6 81 89 buddyinfo uređaji prekida kmsg module scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup montira self thread-self 13 176 210 26 3 737 83 90 c grupa s dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat vrijeme rada
Kao što vidimo, /proc ne identificira naš proces, čak i ako smo zauzeli slobodan PID. Prethodni PID također nije u /proc, a to je vrlo čudno. Možda smo u drugom imenskom prostoru i stoga nismo vidljivi glavnom /proc. Idemo montirati novi /proc i vidjeti što je tamo

1 14 18 210 25 291 738 81 9 uređaji sabirnice fs ključ-korisnici zaključava 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 razno sched_debug swaps vrijeme rada 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 konzole execdomains irq kpagecount montira scsi sysrq-okidač vmalloc info 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 sustavi kcore loadavg net slabinfo thread-self zoneinfo
Naš proces još uvijek ne postoji, što znači da smo u normalnom imenskom prostoru. Provjerimo

Ps -e | grep bash
296 bodova/0 00:00:00 udarac

Samo jedan bash, iz kojeg smo pokrenuli program. Niti prethodni PID niti trenutni nisu na popisu.

Operativni sustav UNIX Robačevski Andrej M.

ID procesa (PID)

Svaki proces ima jedinstveni PID, koji omogućuje jezgri sustava razlikovanje procesa. Kada se kreira novi proces, kernel mu dodjeljuje sljedeći slobodni (tj. koji nije povezan ni s jednim procesom) identifikator. Identifikatori se dodjeljuju uzlaznim redoslijedom, tj. ID novog procesa veći je od ID-a procesa kreiranog prije njega. Ako ID dosegne 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 operacijskog sustava UNIX autor Bach Maurice J

4.4 PRETVARANJE NAZIVA KOMPONENTE DATOTEKE (STAZA ZA PRETRAŽIVANJE) U ID INDEKSA Početna referenca na datoteku je njezino kvalificirano ime (put za pretraživanje), kao kod naredbi open, chdir (promjena direktorija) ili veze. Budući da unutar sustava kernel radi s indeksima, a ne s

Iz knjige Rijetka profesija autor Zuev Evgeniy

Što je ID? Osim nejasnoća u sintaksi, brzo su se pojavile i druge nevolje. Teže ih je pokazati primjerima, pa ćete ih morati objasniti riječima.Sintaksa jezika C++ nezgodna je i u drugom pogledu. Ukratko, direktno

Iz knjige Programiranje Autor Kozlova Irina Sergejevna

11. Identifikator. Ključne riječi Identifikator je niz brojeva, slova i posebnih znakova. U ovom slučaju, prvi znak je slovo ili poseban znak. Za dobivanje identifikatora možete koristiti mala ili velika slova latinične abecede.

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

Process Guardian XP Proizvođač: T.A.S. Neovisno programiranje (http://www.tas-independent-programming.com).Status: besplatno.Veza 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 izvode na računalu.Nakon

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

Identifikator otvorene datoteke Klasa CFile uključuje podatkovni element m_hFile tipa UINT. Pohranjuje identifikator otvorene datoteke. Ako ste kreirali objekt klase CFile, ali još niste otvorili nijednu datoteku, tada je konstanta hFileNull zapisana u m_hFile. Obično nema potrebe

Iz knjige UNIX: Procesna komunikacija Autor Stevens William Richard

ID transakcije Drugi dio strategije vremenskog ograničenja i ponovnog slanja je korištenje ID-ova transakcija (XID-ova) za razlikovanje zahtjeva klijenta i odgovora poslužitelja. 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 Prilikom primanja pošte, zanimljivo je znati vrijeme kada je poslana i primljena. SMTP dodaje ove podatke u proslijeđenu poruku. Osim toga, ovaj protokol prati sve hostove koji su poslali poruku e-pošte i vrijeme

Iz knjige Adobe Audition 3 tutorial Autor autor nepoznat

Dynamic EQ (proces) Efekt Dynamic EQ mijenja količinu filtriranja tijekom vremena. Na primjer, u prvoj polovici vala možete pojačati visoke frekvencije, au drugoj polovici možete promijeniti širinu zahvaćenog frekvencijskog pojasa. Prozor Dynamic EQ ima tri kartice: Gain, Frequency i Q (bandwith). 1. Grafikon učestalosti

Iz knjige PHP Reference autora

Pan/Expander (proces) Efekt Pan/Expand omogućuje vam pomicanje središnjeg kanala (mono komponente) stereo signala i širenje ili sužavanje stereo razdvajanja lijevog i desnog kanala. Središnji kanal se pomiče pomoću središnjeg i okolni kanali stereo snimanja,

Iz knjige Razvoj aplikacija u Linux okruženju. Drugo izdanje Autor Johnson Michael K.

Stretch (proces) Efekt Stretch vam omogućuje promjenu visine (visine) audio signala, tempa ili oboje. Na primjer, možete upotrijebiti ovaj efekt za povećanje visine zvučnog zapisa bez promjene njegovog trajanja ili, obrnuto, promijeniti trajanje bez promjene

Iz knjige Firebird DATABASE DEVELOPER'S GUIDE autora Borri Helen

ID sesije Dakle, ID sesije je naziv privremene memorije koja će se koristiti za pohranu podataka sesije između pokretanja skripte. Jedan SID - jedno skladište. Nema SID-a, nema pohrane i obrnuto. Kako su onda identifikator i ime povezani?

Iz knjige Operativni sustav UNIX 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 jedinstveno identificira

Iz autorove knjige

10.2.3. Uid datotečnog sustava U vrlo posebnim slučajevima, program će možda trebati zadržati svoje root povlastice za sve osim za pristup datotečnom sustavu, za koji koristi korisnički uid. Izvorno korišten u Linux NFS svemirskom poslužitelju

Iz autorove knjige

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

Iz autorove knjige

Iz autorove knjige

ID nadređenog procesa (PPID) Identifikator procesa koji je ovo iznjedrio


Unatoč stabilnosti, neke se aplikacije na Linuxu ponekad zamrznu. Ponekad aplikacije prestanu reagirati ili jednostavno rade tako sporo da ih ne možete pravilno zatvoriti. Jedan od načina za zaustavljanje pokrenute aplikacije u Linuxu je korištenje naredbi kao što su kill ili killall. Pogledajmo kako koristiti ove naredbe, pronaći PID procesa i poslati SIGKILL signal.

Pod procesom ćemo misliti na kopiju programa koji se izvodi na sustavu. Na primjer, ako imate otvorena tri prozora kalkulatora (npr. gcalctool), to znači da su pokrenuta tri procesa.

Pronalaženje PID-a zaustavljenog procesa

Svaki proces u Linuxu ima vlastiti identifikator koji se zove PID. Prije zaustavljanja procesa morate odrediti njegov PID. Da bismo to učinili, koristit ćemo naredbe ps i grep. ps naredba dizajniran je za prikaz popisa aktivnih procesa u sustavu i informacija o njima. naredba grep radi simultano s ps (u kanalu) i pretraživat će rezultate naredbe ps. Sve procese možete popisati pokretanjem u naredbenom retku:

Ali, u pravilu, popis je vrlo velik i pronaći proces koji želimo "ubiti" nije tako lako. Tu u pomoć dolazi naredba grep. Na primjer, da biste pronašli informacije o procesu pod nazivom gcalctool, pokrenite naredbu:

Ps axu | grep gcalctool

Naredba grep pretražit će rezultate naredbe ps i ispisati će se samo oni redovi koji sadrže niz (riječ) gcalctool. Ovdje postoji jedan zanimljiv detalj, na primjer, ako nemate pokrenutu aplikaciju gcalctool, tada nakon izvođenja p.s. | grep gcalctool Dobit ćete:

$ ps axu | grep gcalctool yuriy 25587 0.0 0.0 10636 884 pts/2 S+ 10:20 0:00 grep --color=auto gcalctool

Odnosno, dobili smo sam grep proces, jer smo naveli riječ gcalctool kao parametar naredbe, a grep se našao u izlazu naredbe p.s.

Ako je gcalctool proces pokrenut, dobit ćemo:

Yuriy@yuriy-NIX:~$ ps axu | grep gcalctool yuriy 25609 7,6 0,4 500840 17964 ? Sl 10:20 0:00 gcalctool yuriy 25624 0.0 0.0 10640 884 pts/2 S+ 10:21 0:00 grep --color=auto gcalctool

Ovdje nas zanima linija: " jurij 25609 7,6 0,4 500840 17964 ? Sl 10:20 0:00 gcalctool" Broj 25609 je PID gcalctool procesa.

Postoji još jedan lakši način da saznate PID procesa - ovaj naredba pidof, koji uzima naziv procesa kao parametar i daje svoj PID. Primjer izvršavanja naredbe pidof:

$pidof gcalctool 25609

Proces "ubijamo" naredbom kill

Kada je PID procesa poznat, možemo ga ubiti naredba za ubijanje. Naredba kill uzima PID procesa kao parametar. Na primjer, ubijmo proces broj 25609:

Ubij 25609

Općenito, naredba kill je namijenjena slanju signala procesu. Prema zadanim postavkama, ako ne navedemo koji signal treba poslati, šalje se signal SIGTERM (iz riječi termination). SIGTERM govori procesu da prekine. Svaki signal ima svoj broj. SIGTERM ima broj 15. Popis svih signala (i njihovih brojeva) koje naredba kill može poslati može se dobiti pokretanjem ubiti -l. Za slanje SIGKILL signala (brojčano 9) procesu 25609, pokrenite naredbeni redak:

Ubij -9 25609

Signal SIGTERM možda neće zaustaviti proces (na primjer, ako je signal presretnut ili blokiran), ali SIGKILL uvijek ubija proces, budući da se ne može presresti ili ignorirati.

Procese ubijamo naredbom killall

naredba killall u Linuxu je dizajniran da "ubije" sve procese s istim imenom. Ovo je zgodno jer ne moramo znati PID procesa. Na primjer, želimo zatvoriti sve procese pod nazivom gcalctool. Pokreni u terminalu:

Killall gcalctool

Naredba killall, kao i kill, standardno šalje signal SIGTERM. Za slanje drugog signala morate koristiti opciju -s. Na primjer:

Killall -s 9 gcalctool

Zaključak

Neki se procesi ne mogu zaustaviti pod normalnim korisnikom. Na primjer, ako je proces pokrenut kao root ili kao drugi korisnik na sustavu, tada se naredbe kill i killall moraju izvršiti kao superkorisnik, dodajući sudo (u Ubuntu):

Sudo kill 123

Postoje situacije kada radite u GUI (kao što je GNOME) i ne možete otvoriti emulator terminala da biste zaustavili zaustavljeni proces. Zatim se pomoću tipki možete prebaciti na virtualnu konzolu Ctrl+Alt+F1, prijavite se na njega i odatle izvršavajte naredbe. A zatim se vratite klikom Ctrl+Alt+F7.

Pomoć pri korištenju bilo koje naredbe može se dobiti pomoću naredbe man:

Man ps man grep man pidof man kill man killall

Danas ćemo govoriti o tome kako se nositi s procesima u Ubuntu Linuxu koji su zamrznuti i ne možete ih prekinuti. Oni proždiru sistemske resurse učitavanjem sustava, jedući priličan dio RAM-a, što stvara probleme poput usporavanja rada računala ili djelomičnog zamrzavanja sustava na kratko vrijeme. Postoje različite situacije, ponekad se radna površina zamrzne, ponekad se zamrzne aplikacija, ponekad se zamrzne okruženje radne površine, u tim situacijama ćemo potražiti izlaz kako učiniti bez ponovnog pokretanja sustava i ne isključivanja računala s na sistemskoj jedinici računala jer to nije dobro rješenje.

Ponekad postoji potreba za ubijanjem procesa u Ubuntu Linuxu, kako to učiniti ispravno i ne uzrokovati štetu, razgovarat ćemo o konzolnim rješenjima i putem grafičkog sučelja.

Danas ćemo govoriti o tome kako se nositi s procesima u Ubuntu Linuxu koji su zamrznuti i ne možete ih prekinuti. Oni proždiru sistemske resurse učitavanjem sustava, jedući priličan dio RAM-a, što stvara probleme poput usporavanja rada računala ili djelomičnog zamrzavanja sustava na kratko vrijeme. Postoje različite situacije, ponekad se radna površina zamrzne, ponekad se zamrzne aplikacija, ponekad se zamrzne okruženje radne površine, iz tih situacija ćemo potražiti izlaz, kako učiniti bez ponovnog pokretanja sustava i ne isključivanja računala s gumb na sistemskoj jedinici računala jer to nije dobro rješenje.

Kada radite s Ubuntu Linuxom, vjerojatno već imate pitanja:

Kako odrediti PID da bi se naknadno ubio proces/aplikacija

Ako ne želite pokrenuti naredbu vrh ili neki drugi snažniji analog htop, onda se mučite traženjem ID-a ovog ili onog ID-a procesa, postoji lakši izlaz/rješenje za pronaći PID procesa, možete koristiti naredbu " pidof" ili " P.S".

Recimo da trebamo saznati ID procesa Google Chrome aplikacije, što ćemo učiniti u ovoj situaciji, otvoriti terminal Ctrl + Alt + T i pokrenuti naredbu u terminalu:

Pidof krom

dobivamo 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 zaustaviti proces.

Kako ubiti proces u Linuxu pomoću PID-a

Odredili smo koji je PID u aplikaciji koju želimo ubiti, od onog gore opisanog, vidite da sada imam mnogo kartica pokrenutih u svom pregledniku, plus pojedinačne procese preglednika, ukupno postoji 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 sustavu pokretanjem naredbe:

Sudo ps axu

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

Također možete koristiti dodatnu naredbu za otkrivanje ID-a procesa aplikacije koju želite ubiti:

Ps-A | grep -i ime-aplikacije

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

Ps-A | grep -i skype

dobivamo sljedeći rezultat:

9257? 00:00:57 skype

sve što nam treba je na dlanu, tu je ID i možemo vidjeti koliko dugo traje taj proces.

Kako koristiti naredbu Kill u Linuxu

Već sam gore opisao kako dobiti identifikator PID-a, a zatim sve što trebamo učiniti je upotrijebiti ovaj PID zajedno s 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 kill 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, budući da u ovoj situaciji ne trebamo 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 aplikacija prestane raditi, ovako možete lako ubiti procese koji vam se ne sviđaju.

Naredba smrti, što ne biste trebali raditi u terminalu

Prethodno sam pisao materijal o lošim savjetima, koje se naredbe ne smiju izvršavati u terminalu kako se ne bi ubio sustav, ali popis nije savršen i može se nadopuniti s još mnogo naredbi, od kojih ćete jednu pronaći u nastavku.

Evo primjera naredbe smrti:

Sudo kill -9 -1

Ova naredba će ubiti sve trenutno pokrenute procese. Ne bih preporučio da to radite jer posljedice mogu biti nepredvidive i najvjerojatnije ćete morati ponovno pokrenuti sustav bez grafičkog sučelja. U slučaju da grafičko sučelje iznenada zakaže, otvorite terminal pomoću naredbi CTRL+ALT+F1, svaki novi prozor otvara se po istoj analogiji, jednostavno mijenjajući F1 u F2 i tako dalje.

Također možete dobiti pomoć za gore korištene naredbe putem terminala pokretanjem naredbi:

Man ps man grep man pidof man kill man killall

Ovime završavamo naš kratki materijal, ako nešto ne razumijete, pitajte u komentarima na materijal ispod.

Unatoč činjenici da je Linux stabilniji od Windowsa u pogledu rada programa i raznih servisa, svašta se može dogoditi i ponekad je potrebno prekinuti Linux proces. Ovo može biti potrebno ako se program srušio kada ste pokrenuli sistemsku uslugu u pozadini preko terminala, a ne kroz sustav za inicijalizaciju, kao iu mnogim drugim slučajevima kada je lakše prekinuti Linux proces ponovnim pokretanjem cijelog sustava.

U ovom ćemo članku pogledati neke od najčešćih načina prekida Linux procesa. Detaljno ćemo opisati kako se proces zaustavlja i kako sve učiniti ispravno.

Procesima u operativnom sustavu Linux upravlja se pomoću signala. Uključujući završetak bilo kojeg procesa. Signale odašilje sustav, ali ih može odašiljati i korisnik posebnim naredbama ili čak tipkovničkim prečacima u terminalu. Kada proces primi signal za prekid, mora izvršiti neke pripremne korake.

Potrebno je prekinuti podređene procese, izbrisati privremene datoteke, utičnice i tako dalje. Ali ovisno o složenosti situacije, proces možda neće odgovoriti na sve signale. Pogledajmo glavne signale koji se koriste za dovršetak procesa:

  • SIGINT- najbezazleniji signal prekida, znači Prekid. Šalje se procesu pokrenutom s terminala pomoću tipkovničkog prečaca Ctrl+C. Proces ispravno dovršava sve svoje radnje i vraća kontrolu;
  • SIGQUIT - ovo je još jedan signal koji se šalje, korištenjem prečaca na tipkovnici, programu koji radi na terminalu. Kaže mu da izađe, a program može elegantno prekinuti ili ignorirati signal. Za razliku od prethodnog, generira ispis memorije. Tipkovnički prečac Ctrl+/;
  • SIGHUP- obavještava proces da je veza s kontrolnim terminalom prekinuta, šalje ga uglavnom sustav kada je veza s Internetom prekinuta;
  • SIGTERM- odmah prekida proces, ali ga obrađuje program, pa mu dopušta da prekine podređene procese i oslobodi sve resurse;
  • SIGKILL- također odmah prekida proces, ali se, za razliku od prethodne opcije, ne prenosi na sam proces, već ga obrađuje kernel. Stoga resursi i podređeni procesi ostaju aktivni.

Važno je razumjeti da procesu morate dati priliku da se ispravno završi. Preporučljivo je da se portovi i utičnice oslobode, privremene datoteke zatvore i privremene datoteke izbrišu. Stoga nikada ne šaljite SIGKILL odmah. Šaljite signale za završetak gore navedenim redoslijedom.

Isprva Ctrl+C, ako je moguće, onda SIGTERM - iako prekida proces, to radi kulturno, a samo u krajnjem slučaju SIGKILL. Sada pogledajmo kako u praksi ubiti proces pomoću pid Linuxa. Ako uvijek koristite SIGKILL, onda vam pada na pamet ova slika:

Kako ubiti Linux proces?

Uslužni program kill koristi se za signaliziranje procesa u Linuxu. Njegova sintaksa je vrlo jednostavna:

$ kill - obrada pid signala

Signal je jedan od gore navedenih signala za dovršetak procesa. Standardno, ako ovaj parametar nije naveden, koristi se signal SIGTERM, što je vrlo ispravno. Također moramo naznačiti koji proces treba prekinuti. Za to se koristi jedinstveni identifikator procesa - PID.

Recimo da pokrećemo uslužni program ping. Želimo ga prekinuti upotrebom kill. Zatim prvo saznamo njegov identifikator pomoću naredbe ps:

ps aux | grep ping

Prvi red će prikazati sam uslužni program ping, a drugi red će prikazati sam program ps. Uzimamo željeni PID i prekidamo proces koristeći SIGTERM:

ubiti -TERMIN 20446

I samo ako nakon ove naredbe proces nastavi visjeti, a to možete provjeriti pokretanjem ps. Tek sada možete izvesti SIGKILL:

ubiti -UBITI 20446

Sada provjerimo ponovno:

Ako se proces izvodi kao superkorisnik, onda prirodno morate koristiti sudo. Nije uvijek zgodno ubiti proces pomoću njegovog PID-a, barem zato što još uvijek morate saznati ovaj PID. Mogli bismo napraviti složene konstrukcije koristeći xargs za automatski izračunavanje pid-a iz naziva procesa i odmah ga prekinuti, ali to nije potrebno. Posebni uslužni programi već postoje.

Kako ubiti proces koristeći pkill

Uslužni program pkill je omot oko kill-a, ponaša se potpuno isto i ima istu sintaksu, samo što treba proslijediti naziv procesa kao identifikator procesa. Uslužni program skenira proc direktorij i pronalazi PID prvog procesa s tim imenom, zatim mu šalje SIGTERM. Na ovaj način možete ubiti proces koji se zove Linux. Na primjer, ako želimo dovršiti isti ping:

Također možete ručno postaviti vrstu signala:

pkill -TERM ping

Umjesto ps-a, možete koristiti uslužni program pgrep za pronalaženje pid-a procesa, osiguravajući da je naš program dovršen:

Ali ako je program stvorio nekoliko procesa za vas, na primjer, preglednik Chromium ili Firefox stvara zaseban proces za svaku od kartica, tada će ovaj uslužni program biti od male pomoći. Ovdje nam treba sljedeća opcija.

Kako zaustaviti proces koristeći killall

killall radi slično kao prethodna dva pomoćna programa. Također uzima naziv procesa kao parametar i traži njegov PID u /proc direktoriju. Ali ovaj će uslužni program otkriti sve procese s tim imenom i prekinuti ih. Na primjer:

Kao što vidite, nekoliko procesa je pokrenuto, sve što preostaje je zaustaviti Linux proces koristeći killall:

Naredba će prekinuti sve pokrenute ping pomoćne programe, to možete provjeriti ponovnim pokretanjem pgrep-a:

zaključke

U ovom smo članku pogledali kako zaustaviti Linux proces. Ovaj zadatak ponekad može biti vrlo koristan, ali važno je razumjeti da ga treba obaviti ispravno. Ovo ne znači da je dodavanje SIGKILL umjesto SIGTERM vrlo opasno, ali to se ne isplati. Nadam se da su vam ove informacije bile korisne.