ps aux
termasuk baris perintah penuh (jalur dan parameter), sementara pgrep hanya melihat 15 karakter pertama dari nama yang dapat dieksekusi
ps 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
- tetapi
pgrep php5
tidak akan
Ambil 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
- Tetapi
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: Ppgrep
bukan perintah yang tidak masuk akal. Ini bekerja dengan baik dan dirancang. Masalahnya hanyalah Anda tidak memiliki opsi saat menjalankannya, Anda tidak dapat disalahkanpgrep
untuk itu. Menggunakanps aux | grep xxx
tidak dapat diandalkan sehingga perlu retas untuk memfiltergrep
sendiri dari output dan mungkin memberikan hasil positif yang salahps aux | grep root
.The
ps aux | grep x
perintah memberikan "lebih baik" hasil daripgrep x
dasarnya karena Anda hilang pilihan dengan yang terakhir.Cukup gunakan
-f
opsi untukpgrep
mencari baris perintah penuh dan tidak hanya nama proses yang merupakan perilaku default-nya, misalnya:Berbeda dengan
ps | grep
konstruksi yang Anda butuhkan untuk menyaringgrep
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:
yang lebih sederhana dan lebih dapat diandalkan daripada
atau
sumber
-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
danps
.sumber
Pada saat ini,
ps
akan memberikan hasil yang lebih lengkap daripadapgep -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/86sumber