Як знайти ідентифікатор процесу (PID) запущеної термінальної програми?


116

Я запускаю програму в терміналі, з якою я не можу втекти Ctrl- Cі яку хочу вбити. Як я можу знайти його PID?


1
Це гілка Що робити, коли Ubuntu замерзає? як посилання, щоб запобігти надходженню деталей у цьому питанні.
Jjed

Існує команда pidof .
neverMind9

Відповіді:


127

Відкрийте інший термінал і запустіть, ps ax | grep fooде foo - це назва невідповідальної програми. Це повинно повернути рядок виводу, який виглядає приблизно так:

$ ps ax | grep firefox
2222 ?        S      0:00 /bin/sh /usr/lib/firefox-3.6.9/firefox
2231 ?        Sl   514:36 /usr/lib/firefox-3.6.9/firefox-bin
30290 pts/2    S+     0:00 grep --color=auto firefox

Перше поле кожного рядка виводу - це число, яке представляє ідентифікатор процесу програми, узгоджений grep(ви можете сміливо ігнорувати останнє, яке представляє grepсебе.

Щоб зупинити процес, який порушує правопорушення, виконайте: kill pidде pid - ідентифікатор процесу програми. Можливо, вам доведеться використовувати своє судження про те, яке з сірників потрібно killвідредагувати, або ви можете використовувати його topзамість цього. Використання killсама посилає SIGTERM, який ви повинні спробувати спочатку як це дозволяє програмі правильно прибирати за собою. Якщо SIGTERM не вдається, спробуйте SIGHUP, яка stonger медицини: kill -HUP pid. Якщо все інше не вдалося, надішліть SIGKILL. Але робити це потрібно лише в крайньому випадку, оскільки SIGKILL змушує ядро ​​негайно припинити процес, не маючи можливості для очищення. Це часом може призвести до пошкодження даних або інших проблем. Отже, знову лише надсилайте SIGKILL в крайньому випадку. Для цього зробіть kill -KILL pidабо kill -9 pid.

Якщо ви користуєтеся графічним інтерфейсом, звичайно, вам не доведеться дурити з цим шаленим командним рядком, щоб виконати роботу. Просто відкрийте «Монітор системи», перейдіть на вкладку «Процеси», виберіть процес, який ви хочете зупинити (Гм, чи може це бути той, який використовує 90% ЦП?) І клацніть правою кнопкою миші. Оскільки процес уже зупинений (це проблема, правда?), Виберіть Закінчити процес або вбити процес у меню, що виходить.

Кредит в koanhead


5
Люди ніколи не повинні використовувати SIGKILL (вбивати -9), якщо всі інші методи не вдалися. Тільки перелік kill -9- це погана порада. Я відредагував відповідь, щоб її виправити.
Скотт Северанс

Як знайти під спеціальної функції. У мене є функція, яка містить цикл із pingкомандою та sleep. За даними unix.stackexchange.com/a/275826/72988 , в Ubuntu це неможливо без multiplexer.
Тимо

47

Я не думаю, що немає необхідності в таких довгих командах, коли ти можеш виконувати ті самі команди за допомогою pgrep, pkill, pidof тощо.

  • Отримати розгорнуту програму

pgrep:

   pgrep [options] pattern

ОПИС: pgrep розглядає поточні процеси, що працюють в даний час, і перераховує ідентифікатори процесу, які відповідають критеріям вибору для stdout. Усі критерії повинні відповідати. Наприклад,

  • Щоб знайти процес з ім'ям sshd, що належить root.

    $ pgrep -u root sshd
    
  • Перелічіть процеси, що належать корені АБО демону.

    $ pgrep -u root,daemon
    

pidof:

ОПИС :

Pidof знаходить ідентифікатори процесу (pids) названих програм. Він друкує ці ідентифікатори на стандартному виході.

синтаксис: ім'я програми pidof

  • Щоб вбити програму за допомогою pid, використовуйте приклад pkill:

    pkill pid    
    pkill -f process_name    
    pkill -o process_name    
    pkill -n process_name    
    pkill -l process_name
    

    -fflag: шукає
    -oпрапор process_name (див. man pkill) прапор: виберіть лише найстаріший із відповідних процесів.
    -nпрапор: виберіть лише найновіший з відповідних процесів.
    -lпрапор: перелічіть назву процесу, а також ідентифікатор процесу.


1
Це найкраща відповідь
BlackDivine

20

Найпростіший спосіб дізнатися, чи є програма запущеної програми:

pidof <application name>

Наприклад, якщо ви запустили vim і хочете знати його pid:

pidof vim

Пам'ятайте, що вам потрібно буде вказати точну назву програми, яка була запущена.

Наприклад, якщо ви працюєте з vi та виконуєте, pidof vimви не отримаєте правильних результатів.

Для pidofотримання додаткової інформації див . Сторінку з посібником.


Це не встановлено за замовчуванням. Це може бути пакет пакету sysvinit-utils.
мерехтіння

У мене є MariaDB. pidof mysqldповертає PID. Однак якщо я pidof Mariadbнічого не ввожу, не повертається. Це однаковий PID і для MariaDB, і для MySQL?
Pathros

18

Я знайшов, що приємно використовувати нечутливий до регістру пошук, додавши "-i" та використовуючи "aux" замість "ax", щоб отримати більш описовий результат:

ps aux | grep -i firefox

Якщо ви хочете вбити всі процеси, які ви можете використовувати:

ps aux | grep -i firefox | awk {'print $2'} | xargs kill -9

Це насильне вбивство. Киньте "-9", якщо хочете м'якого вбити.


5
Це також вбиває ps aux | grep -i firefox...процес, оскільки він містить текст firefoxу своїй команді!
Ерік

1
@Eric ви могли використовувати grep -i firefo[x]лише для firefox
AD

@ Джон-Фоль ніколи не радить використовувати -9з kill, см тут для пояснення
AD

3

Якщо ви хочете лише pid (корисно для сценаріїв автозавершення тощо)

pgrep -f desired_program_name

1

Для тих, хто працює з Ubuntu 16.04 LTS, ви повинні використовувати, ps axа не тількиps в командному рядку, інакше ви просто отримаєте процеси, що нереститься з конкретного термінального екземпляра, в якому ви перебуваєте. ] і 'ps' [що ви тільки що бігли])


Мені подобається ps -e(показує всі) і ps -ejH(показує дерево процесу).
Андрій

1
@Andrew приємно, це насправді досить солодко - дякую за пораду
cygnus_x1

0

Ви також можете відкрити інший термінал (або переключитися на інший tty) та запустити top, що в основному є текстовою версією System Monitor. Перший стовпець перераховує PID кожного запущеного процесу, який ви можете вбити, натиснувши K, ввівши PID, а потім ввівши числовий сигнал для надсилання.


0

Ви можете зробити:

ps ax | grep firefox | cut -f2 -d" " - | xargs kill -9

спочатку дві труби отримують інформацію про процес, далі ми намагаємося отримати стовпчик PID, використовуючи розріз old-school, а потім даємо отриманий PID вбити.


kill -9це найбільший пістолет, який ви повинні вбити. Спершу слід спробувати більш щадний сигнал, перш ніж вдаватися до SIGKILL, щоб дати можливість процесу очистити його ресурси.
Байт-командир

Це правда @ByteCommander. Я хотів зробити це одним вкладишем, який виконає роботу.
Аріан Солтані

0
top

або

screen -list|ls

перерахуйте всі pid з відповідним процесом

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