Що робити, коли Ctrl + C не може вбити процес?


171

Ctrl+ Cне завжди працює для вбивства поточного процесу (наприклад, якщо цей процес зайнятий у певних мережевих операціях). У такому випадку ви просто бачите курсор "^ C" і нічого іншого не можете зробити.

Який найпростіший спосіб змусити цей процес вмирати зараз, не втрачаючи терміналу?

Короткий зміст відповідей: Зазвичай ви можете Ctrl+ Zувімкнути процес сну, а потім зробити kill -9 _process-pid_, де ви знайдете пид процесу з ps та іншими інструментами. На Bash (і, можливо, інші оболонки) ви можете зробити kill -9 %1(або "% N" взагалі), що простіше. Якщо Ctrl+ Zне працює, вам доведеться відкрити інший термінал і вбити звідти.


screenбуло б можливим рішенням, що дозволить вам створити нове вікно та killпроцес звідти.
Боббі

2
припустимо, що ви вже були на екрані :)
Дастін Босуелл

Відповіді:


119

Щоб зрозуміти проблему, чому Ctrl+ Cне працює, дуже корисно зрозуміти, що відбувається при натисканні на неї:

Більшість оболонок зв'язуються Ctrl+ Cдля "надсилання сигналу SIGINT до програми, яка зараз працює на передньому плані". Про різні сигнали можна прочитати за допомогою чоловічого сигналу :

 SIGINT        2       Term    Interrupt from keyboard

Програми можуть ігнорувати цей сигнал, оскільки вони також можуть ігнорувати SIGTSTP :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Це те, що робить більшість оболонок, коли ви натискаєте клавішу Ctrl+ Z, тому це не гарантовано працює.)

Є деякі сигнали, які не можуть бути ігноровані процесом: SIGKILL , SIGSTOP та деякі інші. Ви можете надіслати ці сигнали за допомогою команди kill . Отже, щоб убити процес повішення / зомбі, просто знайдіть ідентифікатор процесу (PID). Наприклад, використовуйте pgrepабо, psа потім killце:

 % kill -9 PID

13
Просте зауваження. Остерігайтеся, що "зомбі" технічно є процесом, і це не те саме, що ви тут мали на увазі під "зомбі". (Закінчений процес, якого не чекали () - його батько перебуває у стані зомбі ( Z). У цьому випадку він більше не може обробляти сигнали.)
Стефан Гіменез,

на жаль, іноді ctrl + c, ctrl + z і ctrl + \ всі нічого не роблять, і процес запущено скасувати sudo (дозволено без пароля), тому ви не можете просто надіслати сигнал процесу.
Майкл

112

Якщо Ctrl+ C(SIGINT) не працює, спробуйте Ctrl+ \(SIGQUIT). Потім спробуйте Ctrl+ Z(SIGTSTP). Якщо це поверне вас до підказки оболонки, зробіть killідентифікатор процесу. (Це за замовчуванням сигнал SIGTERM, який ви можете вказати kill -TERM. У деяких оболонках ви можете використовувати %1для посилання на PID.) Якщо це не працює, перейдіть на інший термінал або сеанс SSH і виконайте killабо kill -TERMна ідентифікатор процесу Тільки в крайньому випадку ви маєте це зробити kill -KILL, так само kill -9, оскільки це не дає процесу жодним чином перервати аборт, синхронізувати відкриті файли, видалити тимчасові файли, закрити мережеві з'єднання тощо.


32

Натисніть Ctrl-Z, щоб призупинити програму та поставити її на другий план :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Відновлення на передній план за допомогою fg)

Потім ви можете killабо kill -9це, враховуючи його ідентифікатор процесу (ви отримуєте це від ps a).


13
З bash ви можете kill $!, як $!це спеціальна змінна, що містить pid останньої фонової програми.
Lloeki

@Lloeki Не працює для мене (принаймні, не надійно). Я повинен bgодин раз, перш ніж змінна отримає присвоєне значення.
Даніель Бек

2
@Daniel, правильно. Це, як я вже сказав, останній фоновий процес, тому він потрібен bgяк раз після Ctrl + Z, а просто призупинено.
Lloeki

2
Примітка: це не просто хитрість, якщо використовувати psвисновок (або killall) досить ризиковано, якщо у вас працює кілька процесів з одним і тим же ім'ям. ps -e -o pid,commandнадасть pid + повні аргументи, а не лише назву програми, але, знову ж, може бути недостатньо для дискримінації. На противагу $!це впевнений удар.
Lloeki

1
@Lloeki Я не згоден. Приклад вихідного рядка з ps aмоєї системи: 27721 s000 T 0:00.09 topСкільки призупинених ( Tя думаю) екземплярів однієї команди ( top) у вас працює в одній і тій же tty ( s000)?
Даніель Бек

30

Дивіться також це посилання .

Ctrl+ Z: призупинити процес.

Ctrl+ C: ввічливо попросіть процес припинити зараз.

Ctrl+ \: нещадно вбивати процес, який зараз на першому плані


"ctrl"+ "\"не працював для мене
Бенямін Джафарі

13

Зазвичай ви все-таки можете зупинити процес ( Ctrl+ Z) і потім використовувати kill -9. Для цього kill -9вам спочатку потрібен PID процесу . Для фонових завдань kill -9 %1це найпростіший спосіб зробити - якщо ви не впевнені, яка кількість фонової роботи, яку ви хочете вбити, запустіть jobs.

Крім того, ви можете знайти ідентифікатор процесу за допомогою

ps

Тоді можна бігти

kill -9 <Appropriate PID from ps output>

5

Більш просте рішення для Bash (та інших оболонок?) - зробити:

Ctrl-z      followed by     kill -9 %1

де '% 1' позначає номер завдання, що вбивається. Це може бути "% 2" (або щось інше), якщо ви вже спите інші роботи. Ви можете бачити, який номер завдання це під час натискання клавіші Ctrl-z:

[1]+  Stopped                 <process name>

Зауважте, що 'kill' - версія оболонки kill, а не / bin / kill.


4

1) Якщо ви перебуваєте на консолі та у багатокористувацькому режимі, ви можете натиснути CTRL-ALT-Fn та увійти на інший екран, використовувати ps -ef | grep <myprocessname>або, pidof <myprocessname>а потім вбити -9 процес за номером ідентифікатора.

2) Якщо ви підключені віддалено, зробіть те ж саме через інший термінальний сеанс.

Ви також можете полегшити життя, встановивши htop , що є більш універсальною версією верху, яка дозволяє вибірково вбивати запущені процеси. Більшість дистрибутивів мають htop у репо.

3) якщо ви щойно застрягли у вивішеному сеансі ssh (наприклад, до іншої системи), спробуйте натиснути tilde (~), що є клавішею для виходу, а потім натисніть CTRL-Z, щоб повернутися до хост-сесії, тоді ви може вбити процес застряглого ssh або чекати його затримки, що більшість підвіконь робить після періоду бездіяльності.


0

Якщо ви використовуєте tmux або екран, і жоден із перерахованих вище не працює, ви все одно можете вбити панель <prefix> x, тоді процес також буде вбитий.


0

У вашому / etc / профілі може бути набір пасток із SIGINT (2). Якщо так, видаліть його. Вийдіть із системи та увійдіть назад, і ви повинні бути хорошими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.