ID процесса с использованием ps aux

9

Я новичок в программировании оболочки. Предполагая, что я запустил программу (например, NetBeans) с моего терминала, если я наберу

ps aux|grep netbeans

Я получаю выход

pre      18775  1.2  0.0  12524  1972 pts/3    S    20:17   0:00 

где 18775 указывает PID и т. д. процесса.

Тогда я убиваю его

kill 18775.

после чего пользовательский интерфейс NetBeans исчезает. Если я пытаюсь получить pid с помощью первой команды, я все равно получаю:

pre      19137  0.0  0.0   9136  1068 pts/3    S+   20:19   0:00 grep --color=auto netbeans

Если процесс был убит, почему он все еще показывает вывод выше?

П Рамеш
источник
1
Он не показывает процесс netbeans - он показывает процесс grep, через который передается ps aux! Так как этот процесс grep netbeans, это программа, которую вы видите в конце строки ( grep --color=auto netbeans)
Дэвид Puglielli

Ответы:

15

grep сам по себе Попробуйте что-то вроде:

ps aux |grep [n]etbeans

это удерживает grep от показа себя в выводе

roadmr
источник
2
Это работает, но это не очень приятно. Вы могли бы также сделать ps aux | grep netbeans | grep -v grep. Но используйте вместо этого pgrep.
Мартин Юдинг
1
@queueoverflow pgrepбыло бы неплохо, но оно соответствует только имени процесса. Первый шаблон может соответствовать любому столбцу ps. (Например, что-то, работающее под python или java, pgrep не будет корректно отображать то же самое. То же самое pkillи т. Д.)
Izkata
5

Никогда не используйте psвместе с grep.

Скорее используйте killall netbeans, pkill netbeansчтобы убить это. Для идентификатора процесса pgrep netbeans.

Больше на ps и grep .

Мартин Уединг
источник
5
Это самый бесполезный совет, который я когда-либо слышал. Пока люди знают, как будет выглядеть процесс grep при выводе команды ps (он начинается с «grep»), использование этих двух компонентов абсолютно не представляет опасности. Я понимаю совет не использовать kill в сценарии, но это не относится к делу.
Ован
3
И я думаю, что pgrep хуже, потому что он просто умоляет вас «kill $ (pgrep vi *)» или что-то удивительно опасное в этом роде.
ovangle
1
Это также самый бесполезный ответ на этой странице, так как pgrep, pkillи так далее, только для имени процесса сопоставления - все, что интерпретируется (java, python, bash и т. Д.), Можно отличить только от других под тем же именем процесса, используя ps,
Изката
3
@Izkata - использование -f для pgrep и pkill будет соответствовать всей командной строке. Это иногда полезно, когда вы пытаетесь сопоставить вещи, запускаемые под интерпретаторами, как вы упоминаете. Это также хороший способ выстрелить себе в ногу, поскольку он с радостью убьет все, что ссылается на ваш паттерн в любом месте его командной строки :)
roadmr
4

Потому что это PID для процесса grep, который ставится в очередь для запуска после ps aux.

ovangle
источник
@ ovangle- мигать, я никогда не думал об этом! : D спасибо!
П Рамеш
1
На самом деле, grepэто уже работает , когда ps auxработает. Во время выполнения ps auxего выходные данные отправляются запущенному grepэкземпляру в качестве входных данных. Если оболочка еще не выполнена grep, она не появится в выводе ps.
Элия ​​Каган