Ps Linux'ta yalnızca çekirdek olmayan işlemleri görüntüleyebilir mi?


Yanıtlar:


37

Bu yapmalı (Linux altında):

ps --ppid 2 -p 2 --deselect

kthreadd(PID 2), PPID 0'a sahiptir ( Linux 2.6+ sürümünde ), ancak psPPID 0 için filtre uygulamasına izin vermez; Böylece bu iş etrafında.


Güzel, ama kthreaddher zaman PID 2 olması ne kadar garantilidir ?
l0b0

@ l0b0 Hiçbir fikrim yok :-) Bunu iki adımda yapabilirsiniz: PID'sini belirleyin kthreadd, ardından uygun psçağrıyı yapın. Bu şeye "her zaman" "kthreadd" denilmesi ne kadar garantilidir? Güvenli bir çözüm daha karmaşık olurdu, psnormal olarak çalıştırın ve çıktıyı ayrıştırın, belki bazı testler yapın.
Hauke ​​Laging

2
En azından x86 kemerindeki Linux 2.4'te bu işlemler ppid 1'e sahipti, bu şekilde ayırt edilemiyordu.
Stéphane Chazelas

1
"ps -ef" gibi "yapmak" ps - pid 2 -p 2 - seçim -f - f olarak ve "ps aux" gibi "yapmak" ps - pid 2-p 2 - seçim u "
Peter

1
@ Motor kontrol ettim ve xbununla çalışmayan bayrak gibi görünüyor . ps au --ppid 2 -p 2 --deselectçalışıyor
Sankalp

9

Çekirdek işlemlerini tanımanın bir yolu, herhangi bir kullanıcı hafızasını kullanmamalarıdır, bu yüzden vsz alanı 0'dır. Bu , durumlarına göre elimine edilebilecek zombileri de ( bu gözlem için Stephane Chazelas sayesinde) yakalar .

ps axl | awk '$7 != 0 && $10 !~ "Z"'

Yalnızca PID'leri listelemek için:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'

Benim çözümüm gibi, zombi süreçlerini de içerecek.
Stéphane Chazelas,

1
@StephaneChazelas İyi nokta, filtreye bir koşul ekledim.
Gilles 'SO- kötülük olmayı bırak'

9

Uygulamada aşağıdaki deyimi yeterince buldum:

ps auxf | grep -v ]$

Köşeli parantezlerle biten satırları filtreler, bu da istenmeyen girdileri atlamasına neden olabilir , ancak çok düşük bir olasılıktır. Buna karşılık hatırlamak oldukça kolay ve yazmak oldukça kolay.

Avahi-daemon gibi bazı işlemler işlem adı bilgisini parantez içinde ekler (avahi-daemon durumunda ana bilgisayar adı) ve bu komutla filtrelenir.


8

Bu işlemlerin özelliği, çalıştırılabilir bir dosya tarafından desteklenmemeleridir, bu nedenle ( zsh cinsinden ):

ps /proc/[0-9]*/exe(^-@:h:t)

Veya herhangi bir POSIX kabuğu ile:

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"

Bu, /proc/<pid>/exebir dosyaya bağlanan işlemleri kontrol eder .

Fakat bu, /proc/<pid>/exesembolik bağın durumunu kontrol edebilmek için süper kullanıcı olmanız gerektiği anlamına gelir .

Düzenleme : Olduğu gibi, zombi işlemleri (en azından) aynı koşulu yerine getirir, bu nedenle bunların dışlanmasını istemiyorsanız, geri eklemeniz gerekir. Sevmek:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

Not ps -fyakalanan görünen köşeli parantez içinde olanlar süreç isimleri değil çünkü onlar ediyoruz çekirdek süreçleri, ancak boş olduğu için argv[](yerine ps göstermelidir işlem adını argv[0]orada). argv[]Aynı zamanda boş bir kullanıcı alanı işlemine sahip olabilirsiniz argv[0]ve bu formdaki bir işlem ismine sahip olabilirsiniz, [some-string]böylece psçıktının bu köşeli parantezlere göre filtrelenmesi kusursuz bir seçenek değildir.


Bu standart olmayan kabuk sözdizimi, sanırım.
Totor

1
@Totor, dediğim gibi, ilk zshsözdizimi. İkinci standart POSIX sh( psve findve cutve paste) sözdizimidir. Tabii ki /procPOSIX tarafından belirtilmemiştir.
Stéphane Chazelas

Bu cevabı kabul etmek evrenseldir (düzenleme için teşekkürler). Ancak, Hauke ​​Laging'in cevabı, 2.4 çekirdeği ile ilgilenmediğiniz sürece oldukça iyi ve anlaşılır.
Totor,

@Totor, Hauke'nin cevabı da süper kullanıcı imtiyazı gerektirmemesi avantajına sahiptir. Cevabım 2.4 ve 2.6 / 3 çekirdekleri ile çalışıyor, ama yine de 4.x'de çalışacağının garantisi olmadığını sanıyorum.
Stéphane Chazelas

Hmm, haklısın, kök ayrıcalıklarını düşünmedim. Kök olmadığınızda hala bir cevap aldığınız için hatalara yol açabilir, ancak farklıdır (bu nedenle, onları sayarken dikkatli olmalısınız wc -l). O zaman, Hauke ​​Laging'in cevabını kabul edeceğim ve size bir artı değer vereceğim. ;)
Totor

1

psÇıktıyı ayrıştırabilir ve parantez içinde olmayan işlem adlarını arayabilirsiniz.

ps aux | awk '$NF!~/^\[.+\]$/'

İlgilendiğiniz kullanıcıların listesini almak için biraz daha az güvenilmez bir yol: awk -F: '$7 ~ home { print $1 }' /etc/passwd- ancak yine de bu tür bir kullanıcı adından bahseden işlemlere sahip olacaksınız ve geçici dosyayı etrafta bırakacaksınız. Düşüşümü geri çekeceğim ancak üçüncü çözümünüz makul olduğu için.
Keith Thompson

Bah, her zaman haklısın, @KeithThompson, diğerlerini kaldırdılar, buna değmezler. Eski (şimdiki) yorumları temizlememe yardım eder misin?
terdon

2
Bunun çıktıdaki $NFkomut satırının son sözcüğü olduğuna dikkat edin ps aux. Çekirdek olmayan süreçler [...]orada olabilir . Cevabımda dediğim gibi, [xxx]gösterim, çekirdek işlemleri oldukları için değil, aynı zamanda çekirdek olmayan işlemlere de izin verilen bir komut satırı (argümanı) olmadığı içindir.
Stéphane Chazelas

1

Bunu psyoğun şekilde basitleştirilmiş ve çıktının farklı olduğu meşgul kutusunda çalışan herkes için, Gilles'un bu büyük cevabı iyi bir şekilde işler:

ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'

Gilles'un cevabına göre, buradaki metodoloji herhangi bir kullanıcı hafızası kullanmayan işlemleri bulmak (`vsz col == 0) ve zombi işlemlerini filtrelemek (durum col 'Z' değildir).

Çıkış sütunları, 1 tabanlı awk alan sayıları buna göre ayarlandığı sürece kolayca ayarlanabilir. PS'in sahte bir değer koyarak kullanabileceği seçenekleri görün ve size söyleyecektir. Örneğin:

$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss

0

Sadece sayıma ihtiyacınız varsa ... Çekirdeğe karşı kullanıcı işlemlerini filtrelemek için de benzer bir gereksinim vardı, ancak yalnızca her birinin ilgili sayımlarına ihtiyacım vardı. Bu benim çözümümdü:

ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'

Örnek çıktı :

Kernel processes    353
User processes       52
Total processes     405

Açıklama : VSZ = 0 işlemlerinin çekirdek işlemler olarak kabul edilebileceği kesimini kullanıyorum. Bu yüzden awk, ps -eo vsizesıfıra eşit olup olmadığını VSZ (from ) ile karşılaştırmalı olarak değerlendiririm . Karşılaştırma sonucu, 0 veya 1 boolean olur. Bir dizi yapıyorum p[]ve bir çekirdek işlemi varsa, işlem listesini aşağı ilerlediğimde, ben de artarım p[1]++. Aksi takdirde, kullanıcı işlemi olarak ben artırırım p[0]++. Tüm artışlardan sonra, END { }bloktaki p [0] ve p [1] için değerleri (yani sayımları) etiketler ve yazdırırım .


0

Aradığın şey dostum değil ps, ama pstree.

İlk olarak, ilk çekirdek işlemini tanımlayın. PID'si genellikle sistemsiz sistemde 1 ve sistemli sistemde 2'dir.

Ardından bu komutu kullanın:

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

Seçilen cevap (with işaretli) başka bir komut kullanıyor:

$ ps --ppid 2 -p 2 --deselect

Bu psemirle ilgili sorun, yalnızca doğrudan çocukları içermesi, ancak bütün torunları içermemesidir. pstreeKomut tüm alt içerir. | wcDoğrulamak için bu iki komutun çıkışını karşılaştırabilir ve sayabilirsiniz (kolay bir yoldur ).

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.