pgrep komutu: Ada göre PID bulma, -f seçeneği ve pidof ile pkill farkı

Test ortamıRHEL ailesiAlmaLinux 9.8procps-ng 3.3root hesabıDebian 12 · procps-ng 4.0.2 normal hesap
Süreç · görev zamanlama komutlarıpgrep, pidofKonum/usr/bin/pgrep

Çalışan bir sürecin numarasını (PID) adına, hesabına veya komut satırına göre bulmak için pgrep komutu kullanılır. Bir AlmaLinux 9 sunucusunda sleep programını farklı adlarla kopyalayıp üç süreç başlattık ve her seçeneğin bulduğu süreçleri karşılaştırdık. Ada göre aramada yalnızca bu üç süreç çıktı; -f ile tüm komut satırında aramada ise onları başlatan timeout da birlikte çıktı.

Aşağıdaki çıktılar bir AlmaLinux 9.8 sunucusundaki root hesabında ve bir Debian 12 sunucusundaki normal bir hesapta çalıştırılan komutların sonuçlarıdır. Aranan süreçler, sleep programının pgdemo-a ve pgdemo-b adlarıyla kopyalanıp 5 dakika sonra kendiliğinden bitmesi için timeout 300 ile başlatılmış kopyalarıdır. Süreç numaraları (PID) ve Debian hesap adı (user1) örnek değerlerle değiştirildi; AlmaLinux sunucusundaki procps-ng sürümü yalnızca ana ve alt sürüme kadar yazıldı.

1️⃣ pgrep komutunun temel kullanımı

  • ↪️ Ada göre PID bulma ve çıkış kodu

pgrep komutundan sonra bir adın bir kısmını yazarsanız, adında bu karakterler geçen süreçlerin numaralarını her satıra bir tane olacak şekilde yazdırır. pgdemo ile aramada iki pgdemo-a ve bir pgdemo-b olmak üzere üç numara çıktı.

pgrep pgdemo
2143
2152
2155

Adı pgdemo-a olarak yazınca yalnızca iki pgdemo-a kaldı.

pgrep pgdemo-a
2143
2152

Aranan metin genişletilmiş düzenli ifade olarak okunur ve seçenek verilmezse yalnızca süreç adında aranır.

Eşleşen süreç yoksa hiçbir şey yazdırmadan biter; bu yüzden sonuç çıkış koduyla kontrol edilir. Var olmayan pgdemo-zz adını aradıktan sonra [echo $?] çalıştırıldığında 1 çıktı.

pgrep pgdemo-zz
echo $?
1

Hiçbir koşul yazmadan çalıştırınca aşağıdaki hatayla birlikte çıkış kodu 2 çıktı. man sayfası çıkış kodlarını 0 (bulundu), 1 (bulunamadı), 2 (komut satırı söz dizimi hatası) ve 3 (bellek yetersizliği gibi ölümcül hata) olarak açıklar.

pgrep
pgrep: no matching criteria specified
Try `pgrep --help' for more information.
echo $?
2

Çıktı yerine bu çıkış kodunu koşul olarak kullanırsanız, bir betik bir sürecin çalışıp çalışmadığını kontrol edebilir. Sürüm [pgrep -V] ile görülür. Debian 12 sunucusunda procps-ng 4.0.2, AlmaLinux 9.8 sunucusunda procps-ng 3.3 vardı.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ pgrep -f seçeneği ve -l, -a çıktısı

  • ↪️ Tüm komut satırında aramada birlikte çıkan süreçler

Yalnızca numaradan hangi süreç olduğu anlaşılmaz; bu yüzden -l ile adı, -a ile tüm komut satırını birlikte yazdırırsınız.

pgrep -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -a pgdemo
2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300

-a çıktısının sonundaki 300 ve 301, sleep programına verilen saniye cinsinden argümanlardır. Aynı adlı iki pgdemo-a sürecini bu argümanlarla ayırt ettik.

-f eklenince pgrep ad yerine tüm komut satırında arar. pgdemo-a, -f ile arandığında numaralar ikiden dörde çıktı.

pgrep -f pgdemo-a
2141
2143
2150
2152

-a de eklenince, artan iki satırın pgdemo-a değerini argüman olarak alıp çalıştıran timeout süreçleri olduğu görüldü. Adları timeout olsa da komut satırlarında pgdemo-a geçtiği için -f koşuluna uydular.

pgrep -af pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

Bir betik içinde -f kullanırken betiğin kendisinin sonuçta çıkıp çıkmadığını kontrol edin. pgrep kendi sürecini sonuca hiç eklemez; ancak pgrep komutunu çalıştıran betiğin komut satırında aranan metin varsa o betik de sonuçta çıkar.

Aldığı metni olduğu gibi [pgrep -af] komutuna veren chk.sh betiğiyle pgdemo-a arandığında, son satıra betiğin kendisi olan bash chk.sh pgdemo-a eklendi.

bash chk.sh pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a

İlk harfi köşeli parantez içine alınmış [p]gdemo-a deseni, düzenli ifade olarak pgdemo-a ile aynı metni bulur; ancak betiğin komut satırında köşeli parantezler olduğu gibi yazılı olduğundan koşula uymaz. Bu desen aynı betiğe verilince betik satırı kayboldu ve yalnızca dört satır kaldı.

bash chk.sh '[p]gdemo-a'
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

3️⃣ pgrep koşul seçenekleri

  • ↪️ -u hesap, -x tam ad, -n ve -o, -c sayı

-x eklenince pgrep adın bir kısmı yerine yalnızca adın tamamı aynı olan süreçleri bulur. pgdemo ile hiçbir şey çıkmadı, pgdemo-a ile aramada iki süreç çıktı.

pgrep -x pgdemo
pgrep -lx pgdemo-a
2143 pgdemo-a
2152 pgdemo-a

-u süreçleri onları başlatan hesaba göre seçer. Virgülle ayrılmış birden çok hesap yazarsanız bu hesaplardan herhangi birine ait tüm süreçleri bulur. root ile başlatılan üç sürecin hepsi [-u root] ile çıktı, [-u daemon] ile hiçbiri çıkmadı.

pgrep -u root -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -u daemon -l pgdemo
pgrep -u root,daemon -c pgdemo
3

Var olmayan bir hesap yazınca [invalid user name] hatasıyla birlikte çıkış kodu 2 çıktı.

pgrep -u no-such-user9 pgdemo
pgrep: invalid user name: no-such-user9

Debian 12 sunucusundaki normal hesapta da kendi hesabıyla başlatılan tek bir sleep sürecini aynı seçeneklerle bulduk.

pgrep -u user1 -l sleep
3047 sleep
pgrep -u user1 -a sleep
3047 sleep 60

Aynı adlı birden çok süreç olduğunda -n yalnızca en son başlatılanı, -o yalnızca ilk başlatılanı yazdırır. 2 saniye arayla başlatılan iki pgdemo-a sürecinden -n sonrakini, -o öncekini seçti.

pgrep -n pgdemo-a
2152
pgrep -o pgdemo-a
2143

man sayfası -n ve -o seçeneklerinin birlikte kullanılamayacağını açıklar. İkisi birlikte yazılınca hata iletisi olmadan yalnızca kullanım bilgisi çıktı.

-c numaralar yerine sayıyı yazdırır. Hiçbir şey bulamazsa 0 yazdırır ve çıkış kodu 1 oldu.

pgrep -c pgdemo
3
pgrep -c pgdemo-zz
0

pgrep seçeneklerinin özeti aşağıdadır.

SeçenekKopyalaAçıklama
-f--fullAd yerine tüm komut satırında ara
-l--list-nameNumarayla birlikte adı yazdır
-a--list-fullNumarayla birlikte tüm komut satırını yazdır
-x--exactYalnızca adın tamamı aynı olan süreçleri bul
-u--euidYalnızca belirtilen hesabın başlattığı süreçler; virgülle birden çok yazılırsa herhangi biri
-n--newestEşleşenler arasında en son başlatılan
-o--oldestEşleşenler arasında ilk başlatılan
-c--countNumara yerine sayı yazdır; 0 ise çıkış kodu 1
-d--delimiterNumaralar arasındaki ayırıcıyı belirle (varsayılan satır sonu)
-V--versionSürümü yazdır
SeçenekKopyalaAçıklama
-i--ignore-caseBüyük-küçük harf ayırmadan ara
-v--inverseKoşula uymayan süreçleri bul
-P--parentYalnızca belirtilen üst süreç numarasının (PPID) alt süreçleri
-t--terminalYalnızca belirtilen terminale bağlı süreçler
-g--pgroupYalnızca belirtilen süreç grubu numarasındaki süreçler
-s--sessionYalnızca belirtilen oturum numarasındaki süreçler
-U--uidYalnızca gerçek kullanıcı kimliği aynı olan süreçler
-G--groupYalnızca gerçek grup kimliği aynı olan süreçler
-w--lightweightSüreç numarası yerine tüm iş parçacığı numaralarını yazdır

🔲 pgrep komutu simülatörü

Aşağıdaki simülatör, pgdemo ve timeout için altı satıra örnek süreçlerin eklendiği bir listeyle başlar. Çiplere dokunarak her seçeneğin bulduğu satırları soldaki listede karşılaştırabilir, [pkill pgdemo-b] sonrasında [pgrep -l pgdemo] ile sonucun nasıl azaldığını görebilirsiniz.

pgrep komutu simülatörüprocps-ng 3.3
[root@server work]#
Yalnızca tarayıcınızda çalışır. Soldaki liste örnek değerlerdir ve pgrep komutunun bulduğu satırların yanına [Just matched] eklenir. [pkill] yalnızca listeden satır silerek taklit eder.

4️⃣ pgrep, pidof ve pkill farkı

  • ↪️ Adı aynen arayan pidof ve sinyal gönderen pkill

pidof düzenli ifade kullanmadan yalnızca program adının tamamı aynı olan süreçleri bulur ve numaraları tek satırda boşlukla ayırarak yazdırır. pgdemo-a arandığında iki numara tek satırda çıktı; sonra başlatılan 2152 öndeydi.

pidof pgdemo-a
2152 2143

Adın bir kısmı olan pgdemo ile pgrep komutunun aksine hiçbir şey bulunamadı ve çıkış kodu 1 oldu. Yalnızca bir numara gerekiyorsa -s ekleyin. [pidof -s pgdemo-a] yalnızca 2152 yazdırdı.

pidof pgdemo
pidof -s pgdemo-a
2152

Bulunan numaraların başlangıç zamanını ve üst süreç numarasını (PPID) görmek için numaraları pgrep -d ile virgülle birleştirip ps komutu ile -p seçeneğine verin.

pgrep -d, pgdemo
2143,2152,2155
ps -fp $(pgrep -d, -x pgdemo-a)
UID          PID    PPID  C STIME TTY          TIME CMD
root        2143    2141  0 15:59 ?        00:00:00 ./pgdemo-a 300
root        2152    2150  0 15:59 ?        00:00:00 ./pgdemo-a 301

PPID sütunundaki 2141 ve 2150, iki pgdemo-a sürecini başlatan timeout süreçlerinin numaralarıdır.

pkill süreçleri pgrep ile aynı koşullarla bulur, ancak numaralarını yazdırmak yerine onlara sinyal gönderir. Sinyal yazılmazsa SIGTERM gönderir; sinyali [pkill -HUP ad] örneğindeki gibi değiştirebilirsiniz.

pkill eşleşme bulur bulmaz sinyal gönderdiği için hedefleri önce aynı koşullarla [pgrep -a] veya [pgrep -af] ile kontrol edin. -f ile aranırsa komut satırında aynı metin geçen timeout veya betikler de hedefe girer. Numarayı zaten biliyorsanız kill komutu ile yalnızca o numaraya sinyal gönderin.

KomutArama ölçütüÇıktıGörev
pgrepAdın bir kısmı (regex), -f ile tüm komut satırıNumaralar; -l, -a ile ad ve komut satırıYalnızca bulur
pidofProgram adının tamamıNumaralar tek satırdaYalnızca bulur
pkillpgrep ile aynı koşullarYokBulunan süreçlere sinyal (varsayılan SIGTERM)

🔢 SSS & önerilen içerikler

pgrep süreç adlarını yalnızca /proc/PID/stat içinde kalan 15 karaktere kadar karşılaştırır. Ad 15 karakterden uzunsa ilk 15 karakterle arayın ya da -f ile /proc/PID/cmdline içindeki tüm komut satırında arayın.

ps listesini grep ile süzdüğünüzde o grep komutunun satırında da aranan ad geçtiği için sonuçta birlikte çıkabilir. pgrep kendi sürecini sonuca eklemez ve yalnızca numara yazdırdığı için başka komutlara aktarmak kolaydır.

-v eklenince koşul tersine çevrilir ve uymayan süreçler bulunur. pkill içinde hataları önlemek için kısa -v seçeneği kullanılamaz.

ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 1   +   1   =