Чому “ps aux | grep x "дає кращі результати, ніж" pgrep x "?


82

Я щойно спробував таку команду на моєму Ubuntu, вона нічого не показує:

pgrep php5

не повинен він повертати ідентифікатор процесу php5 (що саме робить наступна команда) ?:

ps aux | grep php5

Отже, яка різниця між цими двома командами?

Відповіді:


75

ps auxвключає повний командний рядок (шлях та параметри), тоді як pgrep розглядає лише перші 15 символів імен виконуваного файлу

ps auxповертає повний командний рядок кожного процесу, при цьому pgrepрозглядає лише імена виконуваних файлів.

Це означає, що вихідний ps aux вивід буде відповідати всьому, що трапляється на шляху або параметрам процесу "бінарний: наприклад"

  • ps aux | grep php5 відповідатиме /usr/share/php5/i-am-a-perl-script.pl
  • але pgrep php5не буде

Візьміть приклад з моєї системи - тільки ми будемо використовувати python замість php5:

  • ps aux | grep python дає нам:
izx 2348 0,0 0,7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / юни -об’єктив-відео / юнит-об'єктив-відео
izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / Единство-Об'єм -Відео-віддалений / Єдність-Обсяг-Відео-віддалений
корінь 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d
izx 6272 0,0 2,9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager - no-focus-on-map
корінь 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
  • Але pgrep pythonлише повернення 11729, які ви побачите з наведеного вище списку, це:
корінь 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus

3
"pgrep -l" також обрізає процес до 15 символів, що, ймовірно, є помилкою, але було подібним протягом століть
Торсен

1
Ну, це в стартовій панелі як виправна помилка, починаючи з 2008 року :) "Команда зверху та ps скорочує після 15 символів" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsen

2
Так, це пояснюється, з коментаря №3: Це пов'язано з тим, що деякі процедури procs отримують назву команди, /proc/<pid>/statале не від неї/proc/<pid>/cmdline . Гаразд, @Thorsen, ви виграєте бал-спрей, це помилка: P
ish

2
@xczzhh pgrep- це нерозумна команда. Він працює добре і як задумано. Проблема полягає лише в тому, що вам не вистачало опції під час її запуску, ви не можете звинувачувати pgrepв цьому. Використання ps aux | grep xxxненадійно, тому потрібні хаки, щоб відфільтрувати grepсебе з виводу, і це може дати помилкові позитиви, наприклад, з ps aux | grep root.
jlliagre

1
Це повинно бути в рекламі проти наркотиків, творці інструментів bash були настільки запалені в LSD, що вони думали, що такі речі були добре розроблені
Енді Рей,

78

ps aux | grep xКоманда дає «кращі» результати , ніж в pgrep xосновному тому , що вам не вистачає варіант з останнім.

Просто використовуйте -fпараметр для pgrepпошуку повного командного рядка, а не тільки імені процесу, яке є його поведінкою за замовчуванням, наприклад:

pgrep -f php5

На відміну від ps | grepконструкції, за допомогою якої вам потрібно відфільтрувати grepлінію або використати трюкові візерунки, pgrepпросто не виберете себе за дизайном.

Більше того, якщо ваш візерунок з'явиться в ps USERстовпці, ви отримаєте небажані процеси у висновку, pgrepне страждаючи від цього недоліку.

Якщо ви хочете отримати повну інформацію, а не лише підписи, ви можете використовувати:

ps wup $(pgrep -f python)

що простіше і надійніше, ніж

ps aux | grep python | grep -v grep

або

ps aux | grep p[y]thon

3
Також додайте параметр -a( --list-full), якщо ви хочете бачити повний командний рядок, а не лише pid. (Старішого pgrep не було -a, робив це на-fl .)
Бені Чернявський-Паскін

1
Первісне питання було питання про різницю, але це насправді дає тим з нас, хто намагається отримати pgrepхороше рішення. +1
2rs2ts

@ 2rs2ts Спасибі, мені справді не вистачало відповіді на поставлене запитання. Виправлено зараз.
jlliagre

У деяких випадках, коли програми модифікуються /proc/self/cmdlineна "описовий", pgrep -fa rubyвони не відповідають, наприклад. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], тоді як "тупіше" pgrep -a rubyбуде. Не впевнений, чи може останній також обдурити.
Бені Чернявський-Паскін

@ BeniCherniavsky-Paskin Я думаю, що це міг бути коментарем до питання, оскільки це стосується і обох, pgrepі ps.
Франклін Ю

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
Це може дати відповідь на запитання, але, можливо, ви можете розширити свою відповідь, щоб пояснити, що робить ця команда однієї лінії.
fossfreedom

1

У цей час psбуде дано більш повний вихід, ніж те pgep -f, що pgrep обмежений першими 4 096 символами (часто це стосується користувачів Java, які шукають клас входу програми Java з довгим класовим шляхом). Відстеження помилок таке: https://gitlab.com/procps-ng/procps/isissue/86


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