Neden “ps aux | grep x ”“ pgrep x ”den daha iyi sonuç verir mi?


82

Ubuntu'mda şu komutu denedim, bir şey göstermiyor:

pgrep php5

php5 işlem kimliğini döndürmemeli mi?

ps aux | grep php5

Peki, bu iki komut arasındaki fark nedir?

Yanıtlar:


75

ps auxtam komut satırını (yol ve parametreler) içerir; pgrep yalnızca çalıştırılabilir adların ilk 15 karakterine bakar

ps auxHer işlemin tam komut satırını döndürür, ancak pgrepyalnızca çalıştırılabilir dosyaların adlarına bakar.

Bu, grepping ps aux çıktısının yoldaki herhangi bir şeyle eşleşeceği veya 'ikili' bir işlemin parametreleriyle eşleşeceği anlamına gelir.

  • ps aux | grep php5 eşleşecek /usr/share/php5/i-am-a-perl-script.pl
  • ama pgrep php5olmaz

Sistemimden bir örnek alın - yalnızca python kullanacağız php5:

  • ps aux | grep python bize verir:
izx 2348 0,0 0,7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / birlik-lens-video / birlik-lens-video
izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / birlik kapsamı-video-uzaktan / birlik-kapsamı-video-uzaktan
kök 2805 0.0 0.5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / sistem servisi / sistem servisi-d
izx 6272 0,0 2,9 664400 60320? SNL Jun24 1:16 / usr / bin / python / usr / bin / güncelleme yöneticisi - haritada odaklanma
kök 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / yazılım özellikleri / yazılım özellikleri - dbus
  • Ancak pgrep pythonsadece 11729yukarıdaki listede göreceğiniz iadeler :
kök 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / yazılım özellikleri / yazılım özellikleri - dbus

3
"pgrep -l", işlemi 15 karaktere böler ki bu muhtemelen bir hatadır ancak uzun zamandır böyle olmuştur
Thorsen

1
Peki 2008 yılı gibi bir memba hata olarak fırlatma rampasında öyle :) "üst ve ps kesiği, komut sonra 15 karakter" bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsen

2
Hah, bunu açıklamada açıklıyor, # 3 yorumundan: Bunun nedeni, bazı işlem prosedürlerinin komut adını komuttan alması /proc/<pid>/statama ondan almamasıdır/proc/<pid>/cmdline . Tamam, @Thorsen, böcek spreyini sen kazandın, bu bir böcek: P
ish

2
@ xczzhh pgrepmantıksız bir komut değil. İyi çalışıyor ve tasarlandığı gibi. Mesele şu ki, çalıştırdığınızda bir seçeneği kaçırıyorsunuz, bunun pgrepiçin suçlayamazsınız . Kullanımı ps aux | grep xxxgüvenilmezdir, bu yüzden grepçıktıdan kendini filtrelemek için bilgisayar korsanlarına ihtiyaç duyar ve bunun gibi yanlış pozitifler verebilir ps aux | grep root.
jlliagre

1
Bu bir ilaç karşıtı reklamda olmalı, bash araçları yaratıcıları LSD'ye o kadar yakıldı ki böyle şeylerin iyi tasarlanmış olduğunu düşünüyorlardı
Andy Ray

78

ps aux | grep xKomut "daha iyi" sonuçlar verir pgrep xEğer ikincisi ile bir seçenek eksik olduğu esasen.

Tam komut satırında arama yapmak için -fseçeneği kullanın, pgrepyalnızca varsayılan davranışı olan işlem adını değil, örneğin:

pgrep -f php5

Çizgiyi ps | grepfiltrelemeniz grepveya desen numaralarını kullanmanız gereken yapıdan farklı olarak , pgrepsadece tasarım yoluyla kendini seçmeyecektir.

Üstelik, şablonunuz ps USERsütununda göründüğünde , çıktıda istenmeyen işlemler elde edersiniz pgrep, bu kusurdan zarar görmez.

Sadece çantalar yerine tüm detayları görmek istiyorsanız, şunları kullanabilirsiniz:

ps wup $(pgrep -f python)

olandan daha basit ve daha güvenilir

ps aux | grep python | grep -v grep

veya

ps aux | grep p[y]thon

3
Ayrıca sadece komut satırını değil komut satırının tamamını görmek istiyorsanız -a( --list-full) seçeneğini de ekleyin . (Eski pgrep yoktu -a, bunu yaptı-fl .)
Beni Cherniavsky-Paskin

1
Asıl soru aradaki farkı sormaktı ancak bu aslında bize pgrepgüzel bir çözüm bulmaya çalışanları veriyor . +1
2rs2ts

@ 2rs2ts Teşekkürler, gerçekten sorulan soruyu cevaplamak için eksikti. Şimdi düzeltildi.
jlliagre

Bazı durumlarda, programlar /proc/self/cmdline"açıklayıcı" olarak değiştirilirse , pgrep -fa rubyörneğin eşleşmeyecektir. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], iken "dumber" pgrep -a rubyolacak. İkincisinin de kandırılabileceğinden emin değilim.
Beni Cherniavsky-Paskin

@ BeniCherniavsky-Paskin Ben her ikisine de uygulanıyor beri, soruya bir yorum olabilirdi tahmin pgrepve ps.
Franklin Yu,

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

12
Bu soruya cevabı cevaplayabilir - ancak belki de bir satır komutunun ne yaptığını açıklamak için cevabınızı genişletebilirsiniz.
fossfreedom

1

Şu anda, pgrep ilk 4.096 karakterle sınırlı olduğundan (genellikle uzun bir sınıfyoluna sahip bir Java programının giriş sınıfını arayan Java kullanıcılarını etkiler) psolduğundan daha eksiksiz bir sonuç verecektir pgep -f. Bunu izleyen hata: https://gitlab.com/procps-ng/procps/issues/86


Sonsuza dek bunun için baktım.
tresf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.