Bagaimana saya bisa meminta ps
untuk menampilkan hanya proses pengguna dan bukan utas kernel?
Lihat pertanyaan ini untuk melihat apa yang saya maksud ...
Bagaimana saya bisa meminta ps
untuk menampilkan hanya proses pengguna dan bukan utas kernel?
Lihat pertanyaan ini untuk melihat apa yang saya maksud ...
Jawaban:
Ini harus dilakukan (di Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) memiliki PPID 0 ( di Linux 2.6+ ) tetapi ps
tidak mengizinkan filter untuk PPID 0; jadi ini bekerja-sekitar.
kthreadd
, lalu buat ps
panggilan yang sesuai . Seberapa terjaminkah hal ini akan "selalu" disebut "kthreadd"? Solusi yang aman akan lebih rumit, berjalan ps
normal dan parsing output, lakukan beberapa tes mungkin.
x
bendera yang tidak berfungsi dengan ini. ps au --ppid 2 -p 2 --deselect
bekerja dengan baik.
Salah satu cara untuk mengenali proses kernel adalah mereka tidak menggunakan memori pengguna, jadi bidang vsz adalah 0. Ini juga menangkap zombie (terima kasih kepada Stephane Chazelas untuk pengamatan ini), yang dapat dihilangkan berdasarkan statusnya.
ps axl | awk '$7 != 0 && $10 !~ "Z"'
Untuk hanya daftar PID:
ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'
Dalam praktik saya menemukan idiom berikut cukup:
ps auxf | grep -v ]$
Memfilter baris yang diakhiri dengan tanda kurung, yang mungkin mengakibatkan menghilangkan entri yang tidak diinginkan tetapi sangat tidak mungkin. Sebagai gantinya, cukup mudah diingat dan relatif cepat untuk mengetik.
Beberapa proses seperti avahi-daemon menambah informasi nama proses mereka dalam tanda kurung (nama host dalam kasus avahi-daemon) dan akan disaring oleh perintah ini.
Salah satu kekhasan dari proses-proses tersebut adalah bahwa mereka tidak didukung oleh file yang dapat dieksekusi, sehingga Anda dapat melakukannya ( dalam zsh ):
ps /proc/[0-9]*/exe(^-@:h:t)
Atau dengan shell POSIX:
ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"
Itu adalah memeriksa proses yang /proc/<pid>/exe
merupakan tautan ke file.
Tetapi itu berarti Anda harus menjadi pengguna super untuk dapat memeriksa keadaan /proc/<pid>/exe
symlink.
Sunting : Ketika terjadi proses zombie (setidaknya) memenuhi kondisi yang sama, jadi jika Anda tidak ingin mereka dikecualikan, Anda harus menambahkannya kembali. Seperti:
ps -p "$(
{ find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
ps -Ao pid=,state= | sed -n 's/ Z//p'
} | paste -sd , -)"
Catatan yang ps -f
menunjukkan nama-nama proses dalam tanda kurung siku bukan karena mereka adalah proses kernel, tetapi karena mereka memiliki kosong argv[]
(jadi ps menunjukkan nama proses bukan di argv[0]
sana). Anda dapat memiliki proses ruang pengguna dengan yang kosong argv[]
juga dan Anda dapat memiliki nama proses dengan argv[0]
yang dari bentuk [some-string]
sehingga menyaring ps
output berdasarkan kurung persegi itu bukan pilihan yang mudah.
zsh
sintaks. Yang kedua adalah sintaks POSIX standar sh
(dan ps
dan find
dan cut
dan paste
). Tentu saja /proc
tidak ditentukan oleh POSIX.
wc -l
). Baiklah, saya akan menerima jawaban Hauke Laging , dan memberi Anda jawaban. ;)
Anda juga bisa mem-parsing ps
output dan mencari nama proses yang tidak dalam tanda kurung:
ps aux | awk '$NF!~/^\[.+\]$/'
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- tetapi Anda masih akan mendapatkan proses yang menyebutkan nama pengguna tersebut, dan Anda akan membiarkan file temp tetap berada di sana. Saya akan menarik downvote saya, tetapi hanya karena solusi ketiga Anda masuk akal.
$NF
ini adalah kata terakhir dari baris perintah dalam ps aux
output. Proses non-kernel bisa [...]
ada di sana. Seperti yang saya katakan di jawaban saya [xxx]
notasi bukan karena mereka adalah proses kernel, tetapi karena mereka tidak memiliki baris perintah (tidak ada argumen) yang juga diperbolehkan untuk proses non-kernel.
Bagi siapa pun yang mencoba ini di busybox ps
yang sangat disederhanakan dan hasilnya berbeda, varian jawaban hebat Gilles ini berfungsi dengan baik:
ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'
Sesuai jawaban Gilles, metodologi di sini adalah menemukan proses yang tidak menggunakan memori pengguna mana pun (`vsz col == 0), dan memfilter proses zombie (status col bukan 'Z').
Kolom output dapat disesuaikan dengan mudah, selama nomor bidang awk 1 berbasis disesuaikan. Lihat opsi yang tersedia ps Anda dengan memasukkan nilai palsu dan itu akan memberi tahu Anda. Sebagai contoh:
$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss
Jika Anda hanya perlu menghitung ... Saya memiliki kebutuhan yang sama untuk memfilter proses kernel vs pengguna, tetapi saya hanya perlu menghitung masing-masing. Ini solusi saya:
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]}'
Output sampel :
Kernel processes 353
User processes 52
Total processes 405
Penjelasan : Saya menggunakan retas yang VSZ = 0 proses dapat dianggap sebagai proses kernel. Jadi dengan awk
, saya mengevaluasi perbandingan pada VSZ (dari ps -eo vsize
), apakah itu sama dengan nol. Hasil perbandingan akan berupa boolean 0 atau 1. Saya membuat array p[]
, dan ketika saya menjalankan daftar proses, jika itu adalah proses kernel, saya bertambah p[1]++
. Kalau tidak, sebagai proses pengguna, saya naik p[0]++
. Setelah semua penambahan, saya memberi label dan mencetak nilai (yaitu jumlah) untuk p [0] dan p [1] di END { }
blok.
Apa yang kamu cari, temanku, bukan ps
, tapi pstree
.
Pertama, identifikasi proses kernel pertama. PID-nya umumnya 1 pada sistem tanpa systemd dan 2 dengan systemd.
Kemudian gunakan perintah ini:
$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'
Jawaban yang dipilih (satu dengan ✅) menggunakan perintah lain:
$ ps --ppid 2 -p 2 --deselect
Masalah dengan ps
perintah ini adalah bahwa itu hanya mencakup anak-anak langsung tetapi tidak semua keturunan. The pstree
perintah mencakup semua keturunan. Anda dapat membandingkan dan menghitung output dari kedua perintah ini (cara mudah digunakan | wc
) untuk memverifikasi.
kthreadd
selalu PID 2?