Bagaimana membuat perintah ps menampilkan memori dalam mb, bukan kb?

11

Perintah Linux ps menunjukkan penggunaan memori yang berbeda seperti rss, ukuran dalam kb secara default. Apakah ada cara untuk menunjukkan dalam mb atau gb seperti ls -s --human-readablehalnya?

balki
sumber
1
Kurangnya disebutkan dalam man psmenunjukkan kepada saya bahwa tidak ada opsi bawaan seperti itu.
Ulrich Schwarz

Jawaban:

20

AFAIK Anda tidak dapat mencapainya hanya dengan psperintah murni dengan opsi. Namun Anda dapat menggunakan beberapa pemroses teks seperti awkdan membuatnya untuk melakukan apa yang Anda inginkan:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}'

Ini mengambil hasil dari psdan kemudian untuk setiap baris kecuali yang pertama itu mengganti kolom ke-5 yang di KB normal, ke MB menambahkan akhiran M.

Anda dapat membuatnya menjadi alias dan menyimpannya dalam file .bashrc sehingga Anda dapat memanggilnya dengan sesuatu seperti myps.

Sebagian besar orang bertanya bagaimana mempertahankan format atau menggunakan unit lain dan presisi.

Untuk versi sederhana, Anda dapat menggunakan column -tfilter keluaran:

ps afu | awk 'NR>1 {$5=int($5/1024)"M";}{ print;}' | column -t

Namun ini tidak mengenali spasi di kolom terakhir dengan benar. Sayangnya kita harus berurusan dengan pemformatan teks dan menyiapkan string format kita sendiri dalam printfformat seperti.

ps afu | awk 'NR==1 {o=$0; a=match($0,$11);}; NR>1 {o=$0;$5=int(10*$5/1024)/10"M";}{ printf "%-8s %6s %-5s %-5s %9s %9s %-8s %-4s %-6s %-5s %s\n", $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, substr(o, a);}'

Penjelasan:

  • NR==1kondisi hanya untuk baris pertama (tajuk). Kami menggunakan output ps asli untuk menentukan di mana COMMAND mulai:
    • o=$0 menyimpan seluruh baris yang belum dimodifikasi sehingga kita dapat menggunakannya nanti
    • a=match($0,$11) menemukan lokasi bidang ke-11 (yang seharusnya berada di tempat kolom PERINTAH mulai dalam output asli)
  • NR>1untuk baris berikut (data). Kami mengubah bidang ke-5:
    • $5=int(10*$5/1024)/10"M" mengubah nilai menjadi Megabita dengan satu tempat desimal dan menambahkan akhiran "M".
    • printf menampilkan semua bidang dalam rasa seperti kolom:
      • %-10sberarti suntuk string, 10untuk lebar 10 karakter, -untuk rata kiri
      • %8sberarti suntuk string, 8untuk lebar 8 karakter, dan karena tidak ada -output dari bidang ini disejajarkan dengan benar.
    • substr(o, a)mengambil substring dari garis asli (karenanya odisimpan sebelumnya) mulai dari posisi yang adihitung dalam kondisi sebelumnya, sehingga kita dapat memiliki output perintah yang ditampilkan dengan spasi dipertahankan.
DevilaN
sumber
3
Dimodifikasi untuk GB dan dengan 2 tempat desimal (mis. 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff
1
apakah mungkin untuk mencapai tujuan yang sama dengan mempertahankan psformat? Tab sepenuhnya dilepaskan denganawk
Chris
Saya melihat Anda melakukan casting sebagai int, apakah mungkin desimal seperti 1.2M?
JavaSheriff
Mengapa tab hilang?
Alex78191
@ Alex78191: Menambahkan perintah alternatif untuk memformat dengan output seperti tabel
DevilaN