Как найти идентификатор процесса (PID) работающей терминальной программы?

117

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

Jjed
источник
1
Это ветка Что мне делать, когда Ubuntu зависает? в качестве ссылки, чтобы предотвратить детали в этом вопросе стать слишком техническим.
Джед
Есть команда pidof .
neverMind9

Ответы:

128

Откройте другой терминал и запустите, 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% ЦП?) И щелкните по нему правой кнопкой мыши. Поскольку процесс уже остановлен (это проблема, верно?), Выберите «Завершить процесс» или «Убить процесс» из появившегося меню.

Кредит Коанхеду

Jjed
источник
5
Люди никогда не должны использовать SIGKILL (kill -9), если все остальные методы не сработали. Только перечисление kill -9плохой совет. Я отредактировал ответ, чтобы исправить это.
Скотт Северанс
Как я могу найти pid пользовательской функции. У меня есть функция, которая содержит цикл с pingкомандой и sleep. Согласно unix.stackexchange.com/a/275826/72988 , в Ubuntu это невозможно без multiplexer.
Тимо
49

Я не думаю, что есть необходимость в таких длинных командах, когда вы можете выполнять те же команды с помощью pgrep, pkill, pidof и т.д ...

  • Чтобы получить pid работающей программы

pgrep:

   pgrep [options] pattern

ОПИСАНИЕ: pgrep просматривает запущенные в данный момент процессы и перечисляет идентификаторы процессов, которые соответствуют критериям выбора для stdout. Все критерии должны соответствовать. Например,

  • Чтобы найти процесс с именем sshd, принадлежащий пользователю root.

    $ pgrep -u root sshd
    
  • Список процессов, принадлежащих корневому оператору OR.

    $ 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: поиск по методу process_name (см. man pkill)
    -o: выбор только самого старого из соответствующих процессов.
    -nфлаг: Выберите только самый новый из соответствующих процессов.
    -lфлаг: перечислить имя процесса, а также идентификатор процесса.

Прабхат Кумар Сингх
источник
1
Это лучший ответ
BlackDivine
21

Самый простой способ узнать pid работающей программы - использовать:

pidof <application name>

Например, если вы запустили vim и хотите узнать его pid:

pidof vim

Помните, что вам нужно будет указать точное название программы, которая была запущена.

Например, если вы запускаете vi и запускаете, pidof vimвы не получите правильных результатов.

Обратитесь к pidofстранице руководства для получения дополнительной информации.

Jobin
источник
Это не установлено по умолчанию. Это может быть в пакете sysvinit-utils.
flickerfly
Я получил MariaDB. pidof mysqldвозвращает PID. Однако, если я наберу, pidof Mariadbничего не возвращается. Это один и тот же PID для MariaDB и MySQL?
Патрос
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 в командной строке, в противном случае вы просто получите процессы, порождаемые конкретным экземпляром терминала, в котором вы находитесь (обычно просто «bash» [оболочка, в которой вы находитесь) ] и 'ps' [что вы только что запустили])

cygnus_x1
источник
Мне нравится ps -e(показывает все) и ps -ejH(показывает дерево процессов).
Андрей
1
@ Андрей хорошо, это очень мило - спасибо за подсказку
cygnus_x1
0

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

Вальдир Леонсио
источник
0

Вы могли бы сделать:

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

первые два канала получают информацию о процессе, затем мы пытаемся получить столбец PID, используя срез старой школы, а затем даем полученный PID для уничтожения.

Ариан Солтани
источник
kill -9это самое большое оружие, которое вам нужно, чтобы убить процесс. Прежде чем прибегнуть к SIGKILL, вы должны попробовать более осторожный сигнал, чтобы дать процессу возможность очистить свои ресурсы.
Byte Commander
Это правда @ByteCommander. Я хотел сделать это одним вкладышем, который сделает работу.
Ариан Солтани
0
top

или же

screen -list|ls

перечислить все pid с соответствующим процессом

kill -[pid]
Rakly3
источник