Yanıtlar:
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.
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.
xbununla çalışmayan bayrak gibi görünüyor . ps au --ppid 2 -p 2 --deselectçalışıyor
Ç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}'
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.
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.
zshsözdizimi. İkinci standart POSIX sh( psve findve cutve paste) sözdizimidir. Tabii ki /procPOSIX tarafından belirtilmemiştir.
wc -l). O zaman, Hauke Laging'in cevabını kabul edeceğim ve size bir artı değer vereceğim. ;)
psÇıktıyı ayrıştırabilir ve parantez içinde olmayan işlem adlarını arayabilirsiniz.
ps aux | awk '$NF!~/^\[.+\]$/'
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.
$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.
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
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 .
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 ).
kthreaddher zaman PID 2 olması ne kadar garantilidir ?