Jawaban:
ps aux
termasuk baris perintah penuh (jalur dan parameter), sementara pgrep hanya melihat 15 karakter pertama dari nama yang dapat dieksekusips aux
mengembalikan baris perintah penuh dari setiap proses, sementara pgrep
hanya melihat nama-nama yang dapat dieksekusi.
Itu berarti bahwa output grepping ps aux
akan cocok dengan apa pun yang terjadi di path atau parameter dari proses 'binary: eg `
ps aux | grep php5
akan cocok /usr/share/php5/i-am-a-perl-script.pl
pgrep php5
tidak akanAmbil contoh dari sistem saya - hanya kami yang akan menggunakan python alih-alih php5
:
ps aux | grep python
memberi kita:izx 2348 0.0 0.7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote root 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 --tidak ada fokus-di-peta root 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
pgrep python
hanya pengembalian 11729
, yang akan Anda lihat dari daftar di atas adalah:root 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
tetapi bukan dari/proc/<pid>/cmdline
. OK, @Tenlen, Anda memenangkan semprotan bug, ini bug: P
pgrep
bukan perintah yang tidak masuk akal. Ini bekerja dengan baik dan dirancang. Masalahnya hanyalah Anda tidak memiliki opsi saat menjalankannya, Anda tidak dapat disalahkan pgrep
untuk itu. Menggunakan ps aux | grep xxx
tidak dapat diandalkan sehingga perlu retas untuk memfilter grep
sendiri dari output dan mungkin memberikan hasil positif yang salah ps aux | grep root
.
The ps aux | grep x
perintah memberikan "lebih baik" hasil dari pgrep x
dasarnya karena Anda hilang pilihan dengan yang terakhir.
Cukup gunakan -f
opsi untuk pgrep
mencari baris perintah penuh dan tidak hanya nama proses yang merupakan perilaku default-nya, misalnya:
pgrep -f php5
Berbeda dengan ps | grep
konstruksi yang Anda butuhkan untuk menyaring grep
garis atau menggunakan trik pola, pgrep
tidak akan memilih sendiri dengan desain.
Selain itu, jika pola Anda muncul di ps
USER
kolom, Anda akan mendapatkan proses yang tidak diinginkan dalam output, pgrep
tidak menderita cacat ini.
Jika Anda menginginkan detail lengkap alih-alih hanya pids, Anda dapat menggunakan:
ps wup $(pgrep -f python)
yang lebih sederhana dan lebih dapat diandalkan daripada
ps aux | grep python | grep -v grep
atau
ps aux | grep p[y]thon
-a
( --list-full
) jika Anda ingin melihat baris perintah penuh dan bukan hanya pid. (Pgrep yang lebih tua tidak punya -a
, lakukan ini-fl
.)
pgrep
bermain solusinya. +1
/proc/self/cmdline
menjadi "deskriptif", pgrep -fa ruby
tidak akan cocok misalnya. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, sedangkan "dumber" pgrep -a ruby
akan. Tidak yakin apakah yang terakhir mungkin tertipu juga.
pgrep
dan ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
Pada saat ini, ps
akan memberikan hasil yang lebih lengkap daripada pgep -f
pgrep terbatas pada 4.096 karakter pertama (sering mempengaruhi pengguna Java yang mencari kelas entri dari program Java dengan classpath yang panjang). Pelacakan bug ini adalah: https://gitlab.com/procps-ng/procps/issues/86