Apakah ada versi Mac OS X Terminal dari perintah "bebas" di sistem Linux?

194

Di Linux, saya sering menggunakan perintah gratis untuk melihat jumlah memori bebas dan yang digunakan saat ini dalam sistem. Sebagai contoh:

$ free
             total       used       free     shared    buffers     cached
Mem:       7264256    1010952    6253304          0     371892     189088
-/+ buffers/cache:     449972    6814284
Swap:      8126456         28    8126428

Sepertinya tidak ada ketika saya masuk freedi Terminal Mac OS X. Apakah ada alternatif?

hpy
sumber

Jawaban:

92

Seperti yang dikatakan @khedron , Anda dapat melihat info ini di Activity Monitor.

Jika Anda menginginkannya di baris perintah, berikut ini adalah skrip Python yang saya tulis (atau mungkin dimodifikasi dari milik orang lain, saya tidak ingat, sekarang sudah cukup tua) untuk menunjukkan kepada Anda jumlah memori Berkabel, Aktif, Tidak Aktif, dan Gratis:

#!/usr/bin/python

import subprocess
import re

# Get process info
ps = subprocess.Popen(['ps', '-caxm', '-orss,comm'], stdout=subprocess.PIPE).communicate()[0].decode()
vm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0].decode()

# Iterate processes
processLines = ps.split('\n')
sep = re.compile('[\s]+')
rssTotal = 0 # kB
for row in range(1,len(processLines)):
    rowText = processLines[row].strip()
    rowElements = sep.split(rowText)
    try:
        rss = float(rowElements[0]) * 1024
    except:
        rss = 0 # ignore...
    rssTotal += rss

# Process vm_stat
vmLines = vm.split('\n')
sep = re.compile(':[\s]+')
vmStats = {}
for row in range(1,len(vmLines)-2):
    rowText = vmLines[row].strip()
    rowElements = sep.split(rowText)
    vmStats[(rowElements[0])] = int(rowElements[1].strip('\.')) * 4096

print 'Wired Memory:\t\t%d MB' % ( vmStats["Pages wired down"]/1024/1024 )
print('Active Memory:\t\t%d MB' % ( vmStats["Pages active"]/1024/1024 ))
print('Inactive Memory:\t%d MB' % ( vmStats["Pages inactive"]/1024/1024 ))
print('Free Memory:\t\t%d MB' % ( vmStats["Pages free"]/1024/1024 ))
print('Real Mem Total (ps):\t%.3f MB' % ( rssTotal/1024/1024 ))

Seperti yang Anda lihat, Anda bisa menelepon vm_statdari baris perintah, meskipun itu dihitung dalam halaman 4kB, karenanya skrip untuk mengkonversi ke MB.

Script juga menghitung penggunaan "memori nyata" dari semua proses yang berjalan untuk perbandingan (ini tidak akan cocok dengan nilai spesifik dari statistik memori keseluruhan, karena memori adalah binatang yang kompleks).


Berikut adalah contoh dari output skrip di sistem saya:

[user@host:~] % memReport.py
Wired Memory:           1381 MB
Active Memory:          3053 MB
Inactive Memory:        727 MB
Free Memory:            1619 MB
Real Mem Total (ps):    3402.828 MB

(sangat sedikit disesuaikan agar sesuai dengan ukuran tab di StackExchange;)

drfrogsplat
sumber
apa cara terbaik untuk menggunakan skrip ini?
iddober
2
tidak yakin apa yang Anda maksud ... salin dan tempel ke file baru, simpan di suatu tempat (mungkin di / usr / local / bin), buat itu bisa dieksekusi dan jalankan?
drfrogsplat
Saya pikir @idober menyarankan Anda menyertakan contoh menjalankannya dan output yang dihasilkan (misalnya tangkapan layar)
AJ.
@ AJ, ah ok, mengerti
drfrogsplat
6
hanya 2 sen saya:ps -caxm -orss= | awk '{ sum += $1 } END { print "Resident Set Size: " sum/1024 " MiB" }'
lemari besi
70

Perintah yang Anda butuhkan adalah vm_stat- mirip dengan alat Unix tradisional vmstattetapi dengan beberapa perbedaan spesifik MACH. Halaman manual ditulis dengan baik.

RI Swamp Yankee
sumber
2
Apa itu 'halaman'?
DilithiumMatrix
8
@ zhermes - Unit memori terkecil yang dapat digunakan oleh sistem ... dalam kasus x86 dan PPC Macs, ini adalah 4k. Halaman bebas adalah jumlah unit memori 4k yang bebas.
RI Swamp Yankee
2
Halaman juga 4K di iOS.
smci
54

Sepertinya alasannya lambat adalah karena top -l 1selalu tertunda satu detik setelah selesai, penundaan standar antara refresh. Menambahkan -s 0 ke perintah membuatnya selesai secara instan:

top -l 1 -s 0 | grep PhysMem

Juga, untuk kejelasan, saya suka menunjukkan masing-masing komponen-mem pada barisnya, jadi saya menambahkan 9 spasi untuk penyelarasan dengan 'PhysMem:' di string pengganti:

top -l 1 -s 0 | grep PhysMem | sed 's/, /\n         /g'
linus
sumber
1
Ini anjing lambat, jauh lebih baik untuk digunakan vm_stat.
mgol
3
Ya, permintaan topsecara signifikan lebih lambat dari panggilan itu vm_stattetapi topekstraknya jauh lebih sedikit bertele-tele dan unitnya adalah megabyte dan bukan halaman. Untuk menjadi lebih sedikit verbose, jeda baris dapat dihapus dan awkdapat diganti dengan grepmenghasilkan top -l 1 | grep ^PhysMem.
Stefan Schmidt
2
Semua hal dipertimbangkan, ini adalah jawaban terbaik. Tidak memberikan hasil dalam pageunit tidak membantu / memerlukan semacam postprocessing hacky untuk membuat unit tersebut dapat ditafsirkan.
ijoseph
39

Berikut ini adalah one-liner sederhana untuk membuat keseluruhan vm_statoutput lebih ramah manusia:

$ vm_stat | perl -ne '/page size of (\d+)/ and $size=$1; /Pages\s+([^:]+)[^\d]+(\d+)/ and printf("%-16s % 16.2f Mi\n", "$1:", $2 * $size / 1048576);'
free:                     2330.23 Mi
active:                   2948.07 Mi
inactive:                 1462.97 Mi
speculative:               599.45 Mi
wired down:                840.46 Mi
copy-on-write:           43684.84 Mi
zero filled:            385865.48 Mi
reactivated:               608.14 Mi
Lloeki
sumber
25

Jika Anda hanya benar-benar tertarik pada penggunaan swap (apa yang akan menjadi garis keluaran terakhir free):

$ sysctl vm.swapusage
vm.swapusage: total = 64.00M  used = 0.00M  free = 64.00M  (encrypted)
rymo
sumber
Saya sedang mencari itu thanx banyak :)
onalbi
20

Ada perintah terminal yang mirip dengan freedi Mac OS X ... namanyatop

Untuk informasi lebih lanjut, Anda dapat melihat dokumen Dukungan Apple ini.

Mac OS X: Cara Melihat Penggunaan Memori Dengan Utilitas "atas"

z4mba
sumber
24
Sebenarnya, "top" pada OS X agak lebih mirip dengan perintah "top" Linux, tentu saja :)
calum_b
6
lebih baik dari atas:htop
nXqd
3
@nXqd htop: perintah tidak ditemukan
itsazzad
4
@SazzadTusharKhan brew install htop jika Anda telah menginstal brew
nXqd
2
Secara teknis mereka tidak mirip sama sekali karena bebas mencetak sesuatu yang bagus dan rapi untuk baris perintah sedangkan atas adalah sesuatu yang Anda lihat secara aktif.
anon58192932
10

Hanya mengambil solusi dari @zack dan menambahkan blok tidak aktif dan spekulatif.

#!/bin/bash

FREE_BLOCKS=$(vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//')
INACTIVE_BLOCKS=$(vm_stat | grep inactive | awk '{ print $3 }' | sed 's/\.//')
SPECULATIVE_BLOCKS=$(vm_stat | grep speculative | awk '{ print $3 }' | sed 's/\.//')

FREE=$((($FREE_BLOCKS+SPECULATIVE_BLOCKS)*4096/1048576))
INACTIVE=$(($INACTIVE_BLOCKS*4096/1048576))
TOTAL=$((($FREE+$INACTIVE)))
echo Free:       $FREE MB
echo Inactive:   $INACTIVE MB
echo Total free: $TOTAL MB
bajceta
sumber
9
#!/bin/bash
top -l 1 | grep PhysMem: | awk '{print $10}'

Hanya untuk pakar Unix:

top -l 1 | awk '/PhysMem:/ {print $10}'
Killinks
sumber
1
Ini tidak lagi mengembalikan hasil dalam macOS modern.
Matt Sephton
gunakan top -l1 | awk '/PhysMem/ {print $2}'pada macos> = High Sierra
JDS
Tidak mengembalikan memori yang digunakan
theillien
8
free="$(( $(vm_stat | awk '/free/ {gsub(/\./, "", $3); print $3}') * 4096 / 1048576)) MiB free"
Zack
sumber
1
Edisi saat ini dari perintah itu tidak berfungsi untuk saya di tcsh(default saya) atau sh. Apakah shell perintah khusus?
Graham Perrin
Ya, itu adalah bashdan kshspesifik. Dalam tcshtry: set freeblocks=`vm_stat | grep free | awk '{ print $3 }' | sed 's/\.//'` ; set freeMB=`expr $freeblocks \* 4096 / 1048576`; set free=`echo $freeMB MiB free`. Anda kemudian dapat melakukan echo $freeuntuk mencetak jumlah memori bebas. Anda juga bisa membuat alias: alias free echo $freeMB MiB free.
jaume
7

Menilai dengan pertanyaan Anda yang lain , saya pikir Anda telah menemukan penggunaan utilitas Activity Monitor untuk melihat status memori Anda, bukan? Sebagai catatan, ada di / Applications / Utilities / Activity Monitor.app.

Michael H.
sumber
7

Tidak ada padanan pasti yang didistribusikan dengan Mac OS X, tetapi ada beberapa cara lain untuk mendapatkan informasi:

  1. system_profiler - Memperlihatkan semua info Profil Sistem Mac di shell
  2. sysctl -a | grep mematau sysctl hw.memsize(total mem)
TrinitronX
sumber
+1, bekerja dari Terminal dalam mode Pemulihan (cmd-r saat bootup)
Steve Kehlet
7

Anda dapat mencoba perintah allmemoryjika Anda menginginkan alat baris perintah yang melaporkan penggunaan memori yang sangat rinci.

AlanGBaker
sumber
1
Sebuah alat yang ampuh, tetapi itu adalah prosesor yang intensif (sekitar 95% dari satu dari dua CPU di MacBookPro5, 2 saya) dan jika banyak memori yang digunakan: jangka waktu yang sederhana allmemorymungkin sangat lama - bagi saya hari ini, lebih dari empat menit per putaran, YMMV. Proses allmemoryuntuk sysdiagnosemungkin memakan waktu lebih lama.
Graham Perrin
6

Di atas adalah terlalu banyak upaya untuk seleraku, dan mengasumsikan bahwa Anda memiliki instalasi sepenuhnya matang juga ... Jika Anda sudah boot dari disk start up Mac OS X, maka semua solusi di atas jelas tidak akan berfungsi. .. Cukup gunakan perintah "hostinfo", inilah output dari MBAir pertengahan 2012 saya yang menjalankan Mavericks (10.9.1):

 Mach kernel version:
 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64
Kernel configured for up to 4 processors.
2 processors are physically available.
4 processors are logically available.
Processor type: i486 (Intel 80486)
Processors active: 0 1 2 3
Primary memory available: 8.00 gigabytes
Default processor set: 195 tasks, 961 threads, 4 processors
Load average: 1.61, Mach factor: 2.38

Bagusnya tentang perintah ini adalah bahwa ia sudah diinstal sebelumnya dengan installer 10.9 juga di bawah /usr/bin, jadi sangat berguna,

idealnya, jika Anda hanya menginginkan RAM maka terbitkan:

$ hostinfo | grep memory

Tidak tahu apakah hostinfo ada di OS sebelumnya ...

rambut ...
sumber
4
Bagaimana cara hostinfomenunjukkan memori yang digunakan ?
nohillside
3
perintah ini (setidaknya di OS 10.6.8) hanya menampilkan memori yang tersedia secara fisik, tetapi tidak seberapa banyak yang digunakan saat ini
MostlyHarmless
Yang berarti ini tidak benar-benar menjawab pertanyaan yang diajukan karena secara khusus menyatakan bahwa ia menginginkan "memori bebas dan bekas".
tangani
5
top -l 1 -s 0 | awk ' /Processes/ || /PhysMem/ || /Load Avg/{print}'

Ini harus dilakukan dengan baik :)

Bijur Vallark
sumber
3

Saya pikir hari ini, psutildan meminfo.pyskripnya memberikan rincian penggunaan memori yang paling membantu. Untuk mencobanya:

pip install psutil
curl -O https://raw.githubusercontent.com/giampaolo/psutil/master/scripts/meminfo.py
python ./meminfo.py

Output yang dihasilkannya terlihat seperti ini:

MEMORY
------
Total      :   16.0G
Available  :    5.5G
Percent    :    65.8
Used       :   13.5G
Free       :    1.5G
Active     :    7.4G
Inactive   :    4.0G
Wired      :    2.1G

SWAP
----
Total      :    1.0G
Used       :   33.5M
Free       :  990.5M
Percent    :     3.3
Sin        :   15.9G
Sout       :   71.6M

Perhatikan Availablebaris, yang menunjukkan perkiraan seberapa banyak memori yang sebenarnya tersedia untuk memulai aplikasi baru , tanpa bertukar.

Saya tidak tahu ada utilitas MacOS lain yang menyediakan perkiraan memori yang tersedia.

Demi perbandingan: Pada sistem Linux, jenis informasi yang sama disediakan di availablekolom dalam output dari versi saat ini free:

              total        used        free      shared  buff/cache   available
Mem:           7.8G        552M        182M        156M        7.1G        6.9G
Swap:            0B          0B          0B
Total:         7.8G        552M        182M

Itu availablekolom dalam freeoutput yang hanya berasal dari MemAvailabledalam /proc/meminfo. Dan pada sistem yang ada /proc/meminfo, psutil juga hanya menggunakannya untuk memperkirakan memori yang tersedia.

Tapi MacOS tidak memiliki /proc/meminfo, sehingga untuk memperkirakan memori yang tersedia dalam kasus itu, psutil mempekerjakan algoritma yang sama digunakan pada Linux untuk menghitung MemAvailableuntuk/proc/meminfo .

sontonbarker
sumber
3

Anda dapat mencoba memory_pressureperintahnya. Lihat output sistem saya (i5, 4 GB RAM)

The system has 2147483648 (524288 pages with a page size of 4096).

Stats: 
Pages free: 90009 
Pages purgeable: 139593 
Pages purged: 7496548 

Swap I/O:
Swapins: 470466 
Swapouts: 530913 

Page Q counts:
Pages active: 407739 
Pages inactive: 148277 
Pages speculative: 16200 
Pages throttled: 0 
Pages wired down: 263064 

Compressor Stats:
Pages used by compressor: 122815 
Pages decompressed: 7327420 
Pages compressed: 17625795 

File I/O:
Pageins: 1538997 
Pageouts: 86692 

System-wide memory free percentage: 63%
João Henrique
sumber
2

Perintah Bash "bebas suka" untuk Mac OSX.

Ini adalah penerbitan ulang kedua dari pos ini. Awalnya, saya mendapat dua -1. Satu karena saya tidak menggambarkan dalam bahasa Inggris, itu diperbaiki. Yang lain karena saya menggunakan gawk(yang bukan merupakan bagian dari instalasi standar OS X), itu juga diperbaiki, sekarang saya gunakan awk. Itu-2 masih ada ;-). Yang terbaik mungkin sekarang untuk menguji dan mengevaluasi perintah itu sendiri?

Saya meninjau ide pertama saya untuk membangun hanya satu perintah berorientasi pengguna akhir dengan tampilan yang ramah dan sangat dapat dikonfigurasi, saya membuat dua:

  • free-like.sh sebuah skrip yang selalu berorientasi "pengguna akhir", dengan lebih akurat, tampilan "ramah" dan dapat dikonfigurasi, tetapi dengan lebih banyak perhitungan dan konsumsi sumber daya,

  • free-like-raw.sh, perintah sekarang berorientasi pengembang, sysadmin, dll., dengan lebih sedikit perhitungan dan konsumsi sumber daya, tetapi juga dengan kurang presisi, kurang "ramah" tampilan.

Data untuk memori fisik diekstraksi dari hasil perintah vm_stat(yang mengembalikan hasil di blocksize). Ketidaktepatan yang dihasilkan dari transformasi dalam byte (number_of_blocks * block_size, nilai default dari perhitungan) akan berada di antara 0 <ukuran blok. Data untuk memori virtual diambil dari topperintah. Ketidaktepatan di sini terkait dengan unit referensi dari topperintah: kilo, mega, giga.

Perhitungan dilakukan dengan menggunakan awkyang dibulatkan (tidak seperti bc). awkjuga lebih cepat dari bc. Anda dapat melihat skrip pengujian di sini: http://myblog.robert.sebille.name/article29.html#awk-bc

Anda dapat melihat hasil dari perintah dalam byte (default), dalam kilo, mega atau giga, dengan x tempat desimal dalam kasus free-like.sh dan jika Anda meminta tampilan dalam mega ou giga.

Script terlalu panjang untuk dikirim, tetapi Anda dapat menemukannya di artikel blog saya ini: http://myblog.robert.sebille.name/article29.html

Artikel ini dalam bahasa Prancis, tetapi menampilkan satu contoh tampilan untuk setiap perintah dan bantuannya yang terintegrasi ( ./free-like.sh -hdan ./free-like-raw.sh -h), dalam bahasa Inggris. Bantuan ini sepenuhnya menggambarkan perintah. Artikel ini juga menampilkan kode.

Bahasa Inggris bukan bahasa ibu saya. Jika seseorang ingin memperbaiki kesalahan dalam bantuan terintegrasi, ia disambut;).

milikmu.

Robert
sumber
Selain kurang lebih tidak dapat digunakan oleh seseorang tanpa pengetahuan bahasa Prancis, skrip Anda tampaknya mengharuskan gawkyang bukan bagian dari instalasi OS X standar.
nohillside
@patrix: Terima kasih atas tanggapan Anda, saya akan membuat deskripsi dalam bahasa Inggris dan saya akan menerjemahkan bantuan terintegrasi juga (saat ini dalam bahasa Prancis). gawk: sebenarnya, saya lupa, terima kasih. Saya bertemu beberapa masalah lokalisasi (koma desimal atau titik desimal) dengan awk. Mereka menghilang tanpa tahu sebabnya. Saya kembali ke awk alih-alih melongo. Saya perlu sedikit waktu untuk menyesuaikan berbagai hal, saya akan memposting ulang ketika sudah siap. Milikmu.
Robert
1
Cukup mengganti gawk dengan awk bekerja untuk saya tanpa masalah.
nohillside
1

vm_stat menunjukkan Anda dalam kilobyte.

Oneliner di bawah ini ditampilkan dalam megabita:

paste <(vm_stat | awk 'NR>1' | grep -o ".*:") <(for i in $(vm_stat | awk 'NR>1' | tr -d '.' | awk '{print $NF}'); do perl -e "print $i/1024" | awk '{printf "%0.2f", $0}'; echo; done) | column -s: -t

Pengembalian:

Pages free                      11.06
Pages active                    798.25
Pages inactive                  776.03
Pages speculative               9.15
Pages throttled                 0.00
Pages wired down                303.27
Pages purgeable                 0.95
"Translation faults"            82172.66
Pages copy-on-write             11629.60
Pages zero filled               27685.41
Pages reactivated               1450.70
Pages purged                    91.66
File-backed pages               430.20
Anonymous pages                 1153.24
Pages stored in compressor      481.75
Pages occupied by compressor    149.91
Decompressions                  1277.92
Compressions                    1622.33
Pageins                         13198.02
Pageouts                        66.61
Swapins                         54.34
Swapouts                        90.63
rubynorails
sumber
1

Jika Anda menggunakan fishshell di osx, bersama dengan fisher paket manajernya.

Saya menulis ekstensi berikut: https://github.com/fisherman/free

Ini adalah pengulangan lengkap dari perintah gratis untuk osx. Lihat sendiri

> free
                 total     used     free   appmem    wired   compressed
Mem:            8.00Gb   6.65Gb   1.95Gb   2.87Gb   2.09Gb   1.86Gb
+/- Cache:               1.24Gb   1.87Gb
Swap(43%):      2048Mb    877Mb   1171Mb
Load Avg:        1.63 1.95 1.95
Olivier Refalo
sumber
Bagus. Segera sobek itu.
PeterVP
-1

top atau htop juga dapat membantu menyelesaikan masalah.

Dai Kaixian
sumber
Selamat bertanya berbeda. Harap berikan informasi lebih lanjut tentang bagaimana perintah yang Anda referensi menjawab pertanyaan.
tubedogg