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 ...
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
selalu PID 2?kthreadd
, lalu buatps
panggilan yang sesuai . Seberapa terjaminkah hal ini akan "selalu" disebut "kthreadd"? Solusi yang aman akan lebih rumit, berjalanps
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.
Untuk hanya daftar PID:
sumber
Dalam praktik saya menemukan idiom berikut cukup:
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.
sumber
Salah satu kekhasan dari proses-proses tersebut adalah bahwa mereka tidak didukung oleh file yang dapat dieksekusi, sehingga Anda dapat melakukannya ( dalam zsh ):
Atau dengan shell POSIX:
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:
Catatan yang
ps -f
menunjukkan nama-nama proses dalam tanda kurung siku bukan karena mereka adalah proses kernel, tetapi karena mereka memiliki kosongargv[]
(jadi ps menunjukkan nama proses bukan diargv[0]
sana). Anda dapat memiliki proses ruang pengguna dengan yang kosongargv[]
juga dan Anda dapat memiliki nama proses denganargv[0]
yang dari bentuk[some-string]
sehingga menyaringps
output berdasarkan kurung persegi itu bukan pilihan yang mudah.sumber
zsh
sintaks. Yang kedua adalah sintaks POSIX standarsh
(danps
danfind
dancut
danpaste
). 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:sumber
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 dalamps 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: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:
sumber
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:
Output sampel :
Penjelasan : Saya menggunakan retas yang VSZ = 0 proses dapat dianggap sebagai proses kernel. Jadi dengan
awk
, saya mengevaluasi perbandingan pada VSZ (darips -eo vsize
), apakah itu sama dengan nol. Hasil perbandingan akan berupa boolean 0 atau 1. Saya membuat arrayp[]
, dan ketika saya menjalankan daftar proses, jika itu adalah proses kernel, saya bertambahp[1]++
. Kalau tidak, sebagai proses pengguna, saya naikp[0]++
. Setelah semua penambahan, saya memberi label dan mencetak nilai (yaitu jumlah) untuk p [0] dan p [1] diEND { }
blok.sumber
Apa yang kamu cari, temanku, bukan
ps
, tapipstree
.Pertama, identifikasi proses kernel pertama. PID-nya umumnya 1 pada sistem tanpa systemd dan 2 dengan systemd.
Kemudian gunakan perintah ini:
Jawaban yang dipilih (satu dengan ✅) menggunakan perintah lain:
Masalah dengan
ps
perintah ini adalah bahwa itu hanya mencakup anak-anak langsung tetapi tidak semua keturunan. Thepstree
perintah mencakup semua keturunan. Anda dapat membandingkan dan menghitung output dari kedua perintah ini (cara mudah digunakan| wc
) untuk memverifikasi.sumber