Відповіді:
ps auxвключає повний командний рядок (шлях та параметри), тоді як pgrep розглядає лише перші 15 символів імен виконуваного файлуps auxповертає повний командний рядок кожного процесу, при цьому pgrepрозглядає лише імена виконуваних файлів.
Це означає, що вихідний ps aux вивід буде відповідати всьому, що трапляється на шляху або параметрам процесу "бінарний: наприклад"
ps aux | grep php5 відповідатиме /usr/share/php5/i-am-a-perl-script.plpgrep 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