Gerçek yaşam senaryosuna dayanarak, size biraz karmaşık bir örnek vereceğim.
Sorun
Diyelim ki komut conky
masaüstüme cevap vermeyi kesti ve ben de onu manuel olarak öldürmek istiyorum. Biraz Unix biliyorum, bu yüzden yapmam gereken şeyin komutu yerine getirmek olduğunu biliyorum kill <PID>
. PID'yi almak için Unix dağıtımımın bana verdiği aracı ps
veya top
veya herhangi bir aracı kullanabilirim . Fakat bunu bir komutla nasıl yapabilirim?
Cevap
$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill
YASAL UYARI: Bu komut yalnızca belirli durumlarda çalışır. Terminalinize kopyalamayın / yapıştırmayın ve kullanmaya başlayın, işlemleri şüphesizce öldürebilir. Aksine nasıl inşa edileceğini öğrenmek .
Nasıl çalışır
1- ps aux
Bu komut çalışan işlemlerin listesini ve bunlarla ilgili bazı bilgileri gösterir. İlginç bilgi, her bir işlemin PID'sini 2. sütununda göstermesidir. İşte kutumdaki komutun çıktısından bir alıntı:
$ ps aux
rahmu 1925 0.0 0.1 129328 6112 ? S 11:55 0:06 tint2
rahmu 1931 0.0 0.3 154992 12108 ? S 11:55 0:00 volumeicon
rahmu 1933 0.1 0.2 134716 9460 ? S 11:55 0:24 parcellite
rahmu 1940 0.0 0.0 30416 3008 ? S 11:55 0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
rahmu 1941 0.0 0.2 160336 8928 ? Ss 11:55 0:00 xfce4-power-manager
rahmu 1943 0.0 0.0 32792 1964 ? S 11:55 0:00 /usr/lib/xfconf/xfconfd
rahmu 1945 0.0 0.0 17584 1292 ? S 11:55 0:00 /usr/lib/gamin/gam_server
rahmu 1946 0.0 0.5 203016 19552 ? S 11:55 0:00 python /usr/bin/system-config-printer-applet
rahmu 1947 0.0 0.3 171840 12872 ? S 11:55 0:00 nm-applet --sm-disable
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:38 conky -q
2- grep conky
Sadece bir süreçle ilgileniyorum, grep
programıma uygun girişi bulmak için kullanıyorum conky
.
$ ps aux | grep conky
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
rahmu 3233 0.0 0.0 7592 840 pts/1 S+ 16:55 0:00 grep conky
3- grep -v grep
2. adımda görebileceğiniz gibi, komut ps
verir grep conky
listesine (sonuçta çalışan bir süreç) süreci. Filtrelemek için koşabilirim grep -v grep
. Seçenek , deseni içerenler dışındaki tüm satırlarla eşleşmesini -v
söyler .grep
$ ps aux | grep conky | grep -v grep
rahmu 1948 0.2 0.0 276000 3564 ? Sl 11:55 0:39 conky -q
Not: 2. ve 3. adımları tek bir grep
aramada yapmanın bir yolunu bilmek isterim .
4- awk '{print $2}'
Şimdi hedef süreçlerimi izole ettim. PID’ini almak istiyorum. Başka bir deyişle, çıktının 2. sözcüğünü almak istiyorum. Şanslıyım ki, çoğu (hepsi?) Modern birimler, tabulardaki verilerle harikalar yaratan bir yazı awk
dili sunmaktadır. Görevimiz kadar kolay hale geliyor print $2
.
$ ps aux | grep conky | grep -v grep | awk '{print $2}'
1948
5- xargs kill
PID’im var. Tek ihtiyacım olana geçmek kill
. Bunu yapmak için kullanacağım xargs
.
xargs kill
Girdiden okuyacağız (bizim durumumuzda borudan), aşağıdakilerden oluşan bir komut oluşturacak kill <items>
( <items>
girişten ne olursa olsun) ve sonra oluşturulan komutu çalıştıracaktır. Bizim durumumuzda bu yürütecek kill 1948
. Görev tamamlandı.
Son sözler
Hangi unix sürümünü kullandığınıza bağlı olarak, bazı programların biraz daha farklı davranabileceğini unutmayın (örneğin, ps
PID'yi $ 3 sütununda verebilir). Bir şeyler yanlış veya farklı görünüyorsa satıcınızın belgelerini (veya daha iyi, man
sayfaları) okuyun. Uzun borular tehlikeli olabileceğinden de dikkatli olun. Özellikle kill
veya gibi komutları kullanırken hiçbir varsayımda bulunmayın rm
. Örneğin, 'conky' (veya 'Aconkyous') adında başka bir kullanıcı varsa, komutum tüm çalışan işlemlerini de öldürebilir!
Söylediklerime dikkat et, özellikle uzun borular için. Burada yaptığımız gibi etkileşimli olarak inşa etmek her zaman daha iyidir, varsayımlarda bulunmak ve daha sonra üzülmek.