Відповіді:
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
/proc/<pid>/stat
але не від неї/proc/<pid>/cmdline
. Гаразд, @Thorsen, ви виграєте бал-спрей, це помилка: P
pgrep
- це нерозумна команда. Він працює добре і як задумано. Проблема полягає лише в тому, що вам не вистачало опції під час її запуску, ви не можете звинувачувати pgrep
в цьому. Використання ps aux | grep xxx
ненадійно, тому потрібні хаки, щоб відфільтрувати grep
себе з виводу, і це може дати помилкові позитиви, наприклад, з ps aux | grep root
.
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
-a
( --list-full
), якщо ви хочете бачити повний командний рядок, а не лише pid. (Старішого pgrep не було -a
, робив це на-fl
.)
pgrep
хороше рішення. +1
/proc/self/cmdline
на "описовий", pgrep -fa ruby
вони не відповідають, наприклад. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, тоді як "тупіше" pgrep -a ruby
буде. Не впевнений, чи може останній також обдурити.
pgrep
і ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
У цей час ps
буде дано більш повний вихід, ніж те pgep -f
, що pgrep обмежений першими 4 096 символами (часто це стосується користувачів Java, які шукають клас входу програми Java з довгим класовим шляхом). Відстеження помилок таке: https://gitlab.com/procps-ng/procps/isissue/86