Управление на процеси в Linux. Как да убия процеса на Linux Ubuntu убийте процеса чрез pid

Днес ще говорим за това как да се справяме с процеси в Ubuntu Linux, които са блокирали и не можете да ги прекратите. Те поглъщат системни ресурси, като зареждат системата, поглъщайки прилична част от RAM, което създава проблеми като забавяне на компютъра или частично замръзване на системата за кратки периоди от време. Ситуациите са различни, понякога работният плот замръзва, понякога приложението замръзва, понякога средата на работния плот замръзва, именно от тези ситуации ще търсим изход как да направим без рестартиране на системата и да не изключваме компютъра с бутона на системния модул на компютъра, тъй като това не е добро решение.

Понякога има нужда да убиете процес в Ubuntu Linux, как да го направите правилно и да не навредите, ще обсъдим както конзолни решения, така и чрез графичен интерфейс.

Днес ще говорим за това как да се справяме с процеси в Ubuntu Linux, които са блокирали и не можете да ги прекратите. Те поглъщат системни ресурси, като зареждат системата, поглъщайки прилична част от RAM, което създава проблеми като забавяне на компютъра или частично замръзване на системата за кратки периоди от време. Ситуациите са различни, понякога работният плот замръзва, понякога приложението замръзва, понякога средата на работния плот замръзва, именно от тези ситуации ще търсим изход, как да направим без рестартиране на системата и да не изключваме компютъра с бутона на системния модул на компютъра, тъй като това не е добро решение.

Когато работите с Ubuntu Linux, вероятно вече имате въпроси:

Как да определите PID, за да убиете впоследствие процеса / приложението

Ако не искате да изпълните командата Горна частили друг по-мощен аналог htop, тогава си направете труда да търсите идентификатора на този или онзи идентификатор на процеса, има по-лесен изход/решение за намиране PIDпроцес, можете да използвате командата " pidof" или " PS".

Да кажем, че трябва да разберем идентификатора на процеса на приложението Google Chrome, какво правим в тази ситуация, отворете терминала Ctrl + Alt + T и изпълнете командата в терминала:

Пидоф хром

получаваме изхода:

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

почти готов, определихме PID, за това как да убием процеса, прочетете по-долу.

Как да убия процес в Linux чрез PID

Определихме кой PID в приложението, който искаме да убием, от горното можете да видите, че имам много раздели, работещи в браузъра и плюс отделни процеси на браузъра, в резултат на това 16 идентификатора, за да ги убия всички, изпълнете команда:

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

можете също да видите всички активни процеси в системата, като изпълните командата:

sudo ps axu

да, толкова е просто. Вместо Chrome може да има друго приложение, скайп или друго.

Можете също да използвате допълнителна команда, за да намерите идентификатора на процеса на приложението, което искате да убиете:

Ps-A | grep -i име-приложение

вместо name-app пишем името на приложението, не въвеждайте пълното име ръчно, използвайте автоматично откриване с помощта на клавишите " РАЗДЕЛ". В резултат на това тази команда ще покаже времето за изпълнение на необходимия процес и съответно неговото PID, който можете да използвате за убиване, нека проверим командата, изпълнена в терминала:

Ps-A | grep -i skype

получаваме следния резултат:

9257? скайп 00:00:57

всичко, от което се нуждаем, е с един поглед, има идентификационен номер, също така виждаме колко време вече се изпълнява този процес.

Как да използвате командата Kill в Linux

Вече описах как да получим PID идентификатора по-горе, тогава просто трябва да използваме този PID заедно с kill, отколкото ще убием процеса, който не харесваме, вижте подробностите малко по-долу.

ID получен и вече можем да убием приложението:

Sudo kill 9257

това е, приложението е мъртво.

Как да убия процес в Linux по име

За да убиете процес по име, можете да използвате командата killall, първо трябва да разберете, че тази команда убива всички процеси, които имат същото име. Това е много удобно, тъй като в тази ситуация не е необходимо да търсим PID на процеса, от който се нуждаем, например, искаме да затворим приложението Skype, ще изпълним командата в терминала:

sudo killall skype

същата опция:

sudo killall -s 9 скайп

в същия момент приложението спира работата си, така че можете лесно да убиете нежеланите процеси.

Командата за смърт, която не трябва да изпълнявате в терминала

По-рано написах материал за лошите съвети, кои команди не трябва да се изпълняват в терминала, за да не убият системата, но списъкът не е перфектен и може да бъде допълнен с още много команди, една от които ще намерите по-долу.

Ето пример за команда за смърт:

Судо убийство -9 -1

тази команда ще убие всички текущи процеси. Не бих ви посъветвал да го изпълнявате, тъй като последствията могат да бъдат непредвидими и най-вероятно ще трябва да рестартирате системата без графичен интерфейс. В случай, че графичният интерфейс внезапно се повреди, отворете терминала с помощта на командите CTRL+ALT+F1, всеки нов прозорец се отваря по същата аналогия, той просто променя F1 на F2 и така нататък.

Можете също да получите помощ за командите, които бяха използвани по-горе, през терминала, като изпълните командите:

Man ps man grep man pidof man kill man killall

Това завършва нашия кратък материал, ако нещо не ви е ясно, попитайте в коментарите към материала по-долу.


В тази статия ще се опитаме да създадем модул на ядрото, който може да промени PID на вече работещ процес в Linux OS, както и да експериментираме с процеси, които са получили променен PID.


Внимание: промяната на PID е нестандартен процес и при определени обстоятелства може да доведе до паника в ядрото.

Нашият тестов модул ще имплементира /dev/test символното устройство, четенето от което ще промени PID на процеса. Благодаря на тази статия за пример за внедряване на символно устройство. Пълният код на модула е даден в края на статията. Разбира се, най-правилното решение беше да се добави системно извикване към самото ядро, но това ще изисква повторно компилиране на ядрото.

Околен свят

Всички действия за тестване на модула бяха извършени във виртуална машина VirtualBox с 64-битова дистрибуция на LInux и версия на ядрото 4.14.4-1. Комуникацията с машината се осъществява чрез SSH.

Опит #1 просто решение

Няколко думи за тока: текущата променлива сочи към структурата task_struct с описание на процеса в ядрото (PID, UID, GID, cmdline, пространства от имена и т.н.)

Първата идея беше просто да промените параметъра current->pid от модула на ядрото на желания.

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",current->pid); , )
За да тествам функционалността на модула, написах програма на C ++:

#включи #включи #включи 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::out<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Заредете модула с командата insmod, създайте /dev/test и опитайте.

# ./a.out Моят родител PID 293 Моят PID 782 Моят нов PID 782
PID не е променен. Може би това не е единственото място, където се посочва PID.

Опит #2 допълнителни PID полета

Ако current->pid не е идентификатор на процес, тогава какво е? Един бърз поглед към кода getpid() посочи структурата task_struct, описваща процеса на Linux и файла pid.c в изходния код на ядрото. Необходимата функция е __task_pid_nr_ns. В кода на функцията има задача за извикване-> pids.pid, ще променим този параметър

Компилиране и опитване

Тъй като тествах чрез SSH, успях да получа резултата от програмата, преди ядрото да се срине:

Моят родител PID 293 Моят PID 1689 Моят нов PID 1689
Първият резултат, вече нещо. Но PID все още не се е променил.

Опит #3 не експортира символи на ядрото

Разглеждайки по-отблизо pid.c, получихме функция, която прави това, от което се нуждаем.
static void __change_pid(struct task_struct *task, enum pid_type тип,
struct pid *ново)
Функцията приема задача, за която е необходима промяна на PID, вида на PID и всъщност новия PID. Създаването на нов PID се управлява от функцията
struct pid *alloc_pid(struct pid_namespace *ns)

Тази функция приема само пространството от имена, в което ще бъде новият PID, това пространство може да бъде получено с помощта на task_active_pid_ns.
Но има един проблем: тези символи на ядрото не се експортират от ядрото и не могат да се използват в модули. Чудесно ми помогна при решаването на този проблем. Кодът на функцията find_sym е взет от там.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); статична asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST драйверът е зареден!\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(current ,PIDTYPE_PID,newpid); printk("нов PID: %d.\n",current->pid); ... )
Компилирайте, стартирайте

Моят родител PID 299 Моят PID 750 Моят нов PID 751
PID променен! Ядрото автоматично разпредели безплатен PID за нашата програма. Но възможно ли е да се използва PID, който друг процес е заел, като PID 1? Добавете код след разпределението

Newpid->numbers.nr = 1;
Компилирайте, стартирайте

Моят родител PID 314 Моят PID 1172 Моят нов PID 1
Получаваме истинския PID 1!

Bash хвърля бъг, който предотвратява превключването на задачите на командата %n, но всички други функции работят добре.

Интересни характеристики на процеси с променен PID

PID 0: Не мога да вляза

Нека се върнем към кода и променим PID на 0.

Newpid->numbers.nr = 0;
Компилирайте, стартирайте

Моят родител PID284 Моят PID 1517 Моят нов PID 0
Оказва се, че PID 0 не е толкова специален? Радваме се, пишем изход и ...

Ядрото пада! Ядрото определи нашата задача като IDLE TASK и, като видя завършването, просто се срина. Очевидно нашата програма трябва да се върне към „нормалния“ PID, преди да приключи.

Невидим процес

Нека се върнем към кода и зададем PID, гарантирано незает
newpid->numbers.nr = 12345;

Компилирайте, стартирайте

Моят родител PID296 Моят PID 735 Моят нов PID 12345
Да видим какво има в /proc

1148 19224288 37798693 consoles fb kcore locks partitions swaps version 10149 2226294887 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 102 15 20 23 290 5 80 88 asound crypto-ched fs keys misc trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo devices interrupts kmsg модули scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 139 18 22 27 30 76 84 91 cmdline драйвер irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains pagetype uptime kallsyms loadavg
Както можете да видите, /proc не дефинира нашия процес, дори ако сме взели безплатен PID. Предишният PID също не е в /proc и това е много странно. Може би сме в различно пространство от имена и следователно не се виждаме от main /proc. Монтирайте новия /proc и вижте какво има там

1 14 18 210 25 291 738 81 9 bus устройства fs key-users заключва pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 sched_debug swaps време на работа 11 15 2 224 28 stat 37 78 84 93 statportys sch drivers страница confiog.g 12 16 20 226 288 4 79 85 acpi конзоли execdomains irq kpagecount монтира scsi sysrq-тригер vmallocinfo 16 6 17 203 cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 core crypto threadav filesystem slabginfo buddyinfo информация за собствената зона
Както и преди, нашият процес не съществува, което означава, че сме в обичайното пространство на имената. Да проверим

Ps-e | grep bash
296 точки/0 00:00:00 баш

Само един баш, от който стартирахме програмата. Нито предишният PID, нито текущият са в списъка.

Както и да е, някои приложения в linuxпонякога затварям. В същото време има ситуации, когато приложението изобщо не реагира или работи толкова бавно, че не е възможно да го изключите правилно. За да излезете бързо от възникналата ситуация, можете да "убиете" този процес. За това се използват команди убивами убивай. Сега ще разберем как да използваме тези команди, да намерим PID на процеса и да изпратим сигнала SIGKILL.

За да избегнем объркване, ще се съгласим да разбираме процес като програма, стартирана в системата. Например, ако имате работещи няколко прозореца на браузъра Mozilla Firefox, това означава, че се изпълняват три процеса.

Намерете PID на процес - команда pidof

PID- уникален идентификатор на процеса в системата linux. За да спрете правилно процес, първо трябва да определите неговия PID. За това се използват командите ps и grep. На свой ред ps командае предназначен да показва списък на активните процеси в системата и информация за тях. grep командаработи едновременно с ps (в канал) и ще търси в резултатите от командата ps. Можете да изброите всички процеси, като изпълните:

Разбира се, PID може да се определи и чрез Горна част. Но в повечето случаи броят на процесите е твърде голям (и динамично се променя отгоре), така че не е толкова лесно бързо и правилно да се определи PID. Точно за това се използва командата grep. Например, за да прекратите процеса на браузъра Google Chrome, трябва да изпълните следната команда:

ps axu | grep chrome

$ ps axu | grep chrome
itechf2 20474 2.7 1.5 938416 120136 tty2 Sl+ 11:07 0:00 /opt/google/chrome/chrome

В нашия случай 20474 е желаният PID. По-лесният начин е да използвате командата pidof, и трябва да посочите името на процеса. Например:

$pidofchrome
20728 20706 20668 20647 20586 20574 20553 20508 20474

Kill процес в Linux - команди kill и killall

Край на процеса в операционната система linux, знаейки неговия PID, можете да използвате командата убивам. Струва си да знаете и разберете: командата kill има за цел да изпрати сигнал към процеса. По подразбиране, ако не посочим какъв сигнал да изпратим, се изпраща сигналът SIGTERM (от думата termination - прекратяване). SIGTERM казва на процеса да прекрати. Всеки сигнал има свой номер. SIGTERM е номер 15. Списък на всички сигнали (и техните номера), които командата kill може да изпрати, може да бъде показан чрез въвеждане убивам -л . За да изпратите сигнал SIGKILL (номериран 9) към процес 2811, изпълнете:

В същото време сигналът SIGTERM може да не спре процеса (например при прихващане или блокиране на сигнала), SIGKILL винаги убива процеса, тъй като не може да бъде прихванат или игнориран.

команда killallв Linux е проектиран да "убива" всички процеси, които имат същото име. Това е удобно, тъй като не е необходимо да знаем PID на процеса. Например искаме да затворим всички процеси с име chrome. Стартирайте в терминала:

Командата killall, подобно на kill, изпраща сигнал SIGTERM по подразбиране. За да изпратите друг сигнал, използвайте опцията . Например:

Ще ви покажем как да убиете процес в Linux. Едно от основните предимства на Linux е възможността за прекратяване на процес, без да се налага да рестартирате сървъра. В тази статия ще ви покажем как да убиете процес в Linux с помощта на командите kill, pkill и killall.

1. Какво е PID

Преди да започнем, трябва да знаем какво е идентификатор на процес (PID).

PID е цифрова идентификация на процеса в . Всеки процес има уникален PID. Наистина, например, първият процес, който стартира на Linux-базирана система, е процес и неговият PID е зададен на 1. Този процес е родител на всички други процеси. Процесът на инициализация не може да бъде унищожен с помощта на команди за унищожаване и това гарантира, че няма да бъде унищожен случайно.

Сега, за да намерим PID на всеки работещ процес на сървъра, можем да изпълним следната команда:

Това ни дава списък на всички работещи процеси и съответните им PID.

Ако искаме да намерим PID на конкретен процес, можем да използваме командата pidof, последвана от името на процеса. Например, за да разберем PID на нашия MySQL процес, можем да изпълним следната команда:

pidof mysql

За още повече подробности можем да използваме командата ps допзаедно с grep:

Ps aux | grep mysql

След като вече знаем какво е PID и как да намерим PID на определен процес, можем да преминем към следващия раздел и да научим как да го убием.

2. Убийте процес с помощта на командата kill в Linux

Има няколко важни правила, които трябва да знаем, преди да започнем да използваме командата kill.

  • Можете да убиете само собствени процеси, които са собственост на вашето потребителско име
  • Не можете да убивате процеси на други потребители
  • Не можете да убивате системни процеси (освен ако не сте суперпотребител)
  • Потребителят root може да убие всеки процес на друг потребител и всеки системен процес

Когато убиваме процес с командата kill, ние всъщност изпращаме конкретния PID сигнал, който искаме да убием. Следните сигнали се използват от командата kill:

1 = Затвори 9 = Уби 15 = Прекрати

Сигналът за затваряне се използва рядко. Най-често използваме сигнала за убийство и ако той не работи, можем да използваме сигнала за прекъсване.

Така че след като намерим PID на процеса, който искаме да убием, използваме един от методите, които описахме по-рано, можем да използваме командата убийте -9 PIDза да убие процеса с този конкретен PID.

Например, ако PID е 6738, тогава можем да използваме следната команда:

Убийте -9 6738

3. Убийте процес с помощта на командата pkill в Linux

Ако искате да използвате името на процеса вместо неговия PID, за да го убиете, тогава можете да използвате командата pkill. Например, ако процесът, който искаме да убием, се нарича, тогава можем да използваме следната команда, за да го убием:

pkill mysql

4. Убийте процес с помощта на командата killall в Linux

Двете предишни команди се използват за убиване само на един определен процес. Но ако искаме да убием процес заедно с всичките му дъщерни процеси, можем да използваме командата убивай:

убийте всички mysql

В този пример ще убием процеса MySQL и всички негови дъщерни процеси.

Те са най-честите примери за спиране на процеси в Linux.

Въпреки факта, че Linux е по-стабилен от Windows по отношение на програми и различни услуги, всичко се случва и понякога се налага да прекратите процеса на Linux. Това може да е необходимо, ако програмата се срине, когато стартирате системната услуга във фонов режим през терминала, а не в системата за инициализация, и в много други случаи, когато е по-лесно да убиете процеса на Linux, рестартирайте цялата система.

В тази статия ще разгледаме някои от най-често срещаните начини за прекратяване на Linux процес. Ще опишем подробно как процесът спира и как да направите всичко правилно.

Управлението на процесите в операционната система Linux се осъществява с помощта на сигнали. Включително завършването на всеки процес. Сигналите се изпращат от системата, но могат да се изпращат и от потребителя чрез специални команди или дори клавишни комбинации в терминала. Когато даден процес бъде сигнализиран за прекратяване, той трябва да извърши подготвителна работа.

Необходимо е да прекратите дъщерните процеси, да изтриете временни файлове, сокети и т.н. Но в зависимост от сложността на ситуацията процесът може да не реагира на всички сигнали. Помислете за основните сигнали, които се използват за прекратяване на процеса:

  • ЗНАК- най-безобидният сигнал за прекратяване означава прекъсване. Изпраща се до процес, стартиран от терминал с помощта на клавишната комбинация Ctrl+C. Процесът правилно завършва всички свои действия и връща контрола;
  • SIGQUIT-това е друг сигнал, който се изпраща чрез клавишна комбинация към програма, работеща в терминала. Той му казва да прекрати и програмата може елегантно да прекрати или игнорира сигнала. За разлика от предишния, той генерира дъмп на паметта. Клавишна комбинация Ctrl+/;
  • РЕГИСТРАЦИЯ- информира процеса, че връзката с контролния терминал е прекъсната, изпраща се главно от системата, когато връзката с интернет е прекъсната;
  • СИГТЕРМ- незабавно прекратява процеса, но се обработва от програмата, като по този начин й позволява да прекратява дъщерните процеси и освобождава всички ресурси;
  • SIGKILL- също незабавно прекратява процеса, но за разлика от предишната опция не се прехвърля към самия процес, а се обработва от ядрото. Следователно ресурсите и дъщерните процеси продължават да работят.

Важно е да разберете, че трябва да дадете шанс на процеса да завърши грациозно. Желателно е портовете и сокетите да бъдат освободени, затворени и временните файлове премахнати. Затова никога не изпращайте SIGKILL веднага. Изпращайте сигнали за прекратяване в последователност, както е посочено по-горе.

Първо ctrl+c, ако е възможно, тогава SIGTERM - въпреки че приключва процеса, прави това културно и само в краен случай SIGKILL. А сега нека да разгледаме как да убием процес от pid Linux на практика. Ако винаги използвате SIGKILL, тогава тази картина идва на ум:

Как да убия Linux процес?

Помощната програма kill се използва за сигнализиране на процеси в Linux. Синтаксисът му е много прост:

$ kill -pid_process сигнал

Сигналът е един от горните сигнали за прекратяване на процеса. По подразбиране, ако този параметър не е зададен, се използва сигналът SIGTERM, което е много правилно. Също така трябва да посочим кой процес да прекратим. За това се използва уникален идентификатор на процеса - PID.

Да кажем, че имаме работеща помощна програма за ping. Искаме да приключим с убийство. След това първо откриваме неговия идентификатор с помощта на командата ps:

ps aux | grep ping

Първият ред ще покаже самата помощна програма ping, а вторият ред ще покаже самата програма ps. Взимаме желания PID и прекратяваме процеса с помощта на SIGTERM:

убийте - ТЕРМИН 20446

И само ако след тази команда процесът продължи да виси и можете да проверите това, като стартирате ps. Само сега можете да SIGKILL:

убийте -УБИЙТЕ 20446

Сега проверяваме отново:

Ако процесът се изпълнява като root, тогава естествено трябва да използвате sudo. Не винаги е удобно да убивате процес по неговия PID, поне защото все още трябва да откриете този PID. Можем да използваме xargs, за да направим много сложни конструкции, за да изчислим pid автоматично от името на процеса и да го прекратим незабавно, но това не е необходимо. Вече има специални помощни програми.

Как да убия процес с pkill

Помощната програма pkill е обвивка за kill, тя се държи точно по същия начин и има същия синтаксис, само че трябва да се предаде името на процеса като ID на процеса. Помощната програма сканира директорията proc и намира PID на първия процес с това име, след което му изпраща SIGTERM. Така че можете да убиете процес, наречен Linux. Например, ако искаме да прекратим същия ping:

Можете също ръчно да зададете типа сигнал:

pkill -TERM пинг

Вместо ps, можете да използвате помощната програма pgrep, за да намерите pid на процеса, уверете се, че нашата програма е завършена:

Но ако програмата е създала няколко процеса за вас, например браузърът chromium или firefox създават отделен процес за всеки от разделите, тогава тази помощна програма няма да помогне много. Ето и следващата опция.

Как да спрете процес с killall

killall работи подобно на двете предишни помощни програми. Той също така приема името на процеса като параметър и търси неговия PID в директорията /proc. Но тази помощна програма ще открие всички процеси с това име и ще ги прекрати. Например:

Както можете да видите, има няколко изпълнявани процеса, остава да спрете Linux процеса с killall:

Командата ще прекрати всички работещи помощни програми за ping, можете да проверите това, като стартирате отново pgrep:

заключения

В тази статия разгледахме как да убием процес на Linux. Понякога тази задача може да бъде много полезна, но е важно да се разбере, че трябва да се направи правилно. Това не означава, че преминаването на SIGKILL вместо SIGTERM е много опасно, но не трябва да го правите. Надявам се тази информация да ви е била полезна.