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 ps
PPID 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, ps
normal olarak çalıştırın ve çıktıyı ayrıştırın, belki bazı testler yapın.
x
bununla ç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>/exe
bir dosyaya bağlanan işlemleri kontrol eder .
Fakat bu, /proc/<pid>/exe
sembolik 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 -f
yakalanan 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.
zsh
sözdizimi. İkinci standart POSIX sh
( ps
ve find
ve cut
ve paste
) sözdizimidir. Tabii ki /proc
POSIX 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.
$NF
komut 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 ps
yoğ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 vsize
sı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 ps
emirle ilgili sorun, yalnızca doğrudan çocukları içermesi, ancak bütün torunları içermemesidir. pstree
Komut tüm alt içerir. | wc
Doğrulamak için bu iki komutun çıkışını karşılaştırabilir ve sayabilirsiniz (kolay bir yoldur ).
kthreadd
her zaman PID 2 olması ne kadar garantilidir ?