web-dev-qa-db-fra.com

Vérifier la mémoire disponible sous Linux

J'écris un script Python qui télécharge des vidéos 4K et les lit à la demande. Lorsque la mémoire de mon appareil dépasse 7,2 Go, la vidéo présentant le plus petit nombre de vues est supprimée.

En utilisant la commande free ou la commande top , je peux obtenir les informations sur la mémoire. Mais concrètement, comment puis-je utiliser la mémoire totale utilisée ? Afin que je puisse renvoyer ceci à la fonction Python à comparer avec le seuil de mémoire.

7
ron123456

Pourcentage de mémoire utilisée (à l'exclusion des mémoires tampons et du cache):

free | awk 'FNR == 3 {print $3/($3+$4)*100}'

Pour votre question, vous avez ajouté: "plus de 7,2 gigaoctets", mais je suppose qu'un pourcentage pourrait être plus flexible.


Pour développer cela, on peut utiliser la même chose pour "pourcentage de mémoire disponible":

free | awk 'FNR == 3 {print $4/($3+$4)*100}'

awk est un outil d'analyse de motif avec des charges et des charges de paramètres. FNR est le numéro d'enregistrement d'entrée dans le fichier d'entrée actuel. Fondamentalement, la ligne en cours de traitement. Donc, FNR recherchera la 3ème ligne où les chiffres sont ce que vous voulez. Les 3 $ et 4 $ pointent vers les 3ème et 4ème colonnes. Si vous voulez le numéro lui-même, utilisez:

free | awk 'FNR == 3 {print $3}'
free | awk 'FNR == 3 {print $4}'

Exemple:

$ free
             total       used       free     shared    buffers     cached
Mem:      16419996   16144316     275680          0     447220   12589412
-/+ buffers/cache:    3107684   13312312
Swap:     16761852      38532   16723320
~$ free | awk 'FNR == 3 {print $3}'
3109056
~$ free | awk 'FNR == 3 {print $4}'
13311240

Si vous voulez avec les tampons et le cache: FNR = 2. Si vous voulez échanger, FNR = 4.

10
Rinzwind

Vous pouvez également lire la source des informations de free, /proc/meminfo:

~ head /proc/meminfo
MemTotal:        4039168 kB
MemFree:         2567392 kB
MemAvailable:    3169436 kB
Buffers:           81756 kB
Cached:           712808 kB
SwapCached:            0 kB
Active:           835276 kB
Inactive:         457436 kB
Active(anon):     499080 kB
Inactive(anon):    17968 kB

Dans Python , par exemple:

with open('/proc/meminfo') as file:
    for line in file:
        if 'MemFree' in line:
            free_mem_in_kb = line.split()[1]
            break

vous obtiendrez la mémoire libre en Ko dans la variable free_mem_in_kb. Avec quelque chose de similaire pour la mémoire totale, vous pouvez soustraire les valeurs (ou ajouter des tampons, mis en cache, etc.).

Vous pouvez également créer un dictionnaire des valeurs du fichier:

from collections import namedtuple
MemInfoEntry = namedtuple('MemInfoEntry', ['value', 'unit'])

meminfo = {}
with open('/proc/meminfo') as file:
    for line in file:
        key, value, *unit = line.strip().split()
        meminfo[key.rstrip(':')] = MemInfoEntry(value, unit)

Récupérez ensuite les valeurs avec meminfo['MemAvailable'].value, par exemple.

15
muru