web-dev-qa-db-fra.com

Comment faire pour que la commande ps affiche la mémoire en mb au lieu de kb?

La commande Linux ps montre différentes utilisations de la mémoire comme rss, taille en Ko par défaut. Existe-t-il un moyen d'afficher en mb ou gb comme ls -s --human-readable Est-ce que?

10
balki

AFAIK vous ne pouvez pas y parvenir simplement par la commande pure ps avec des options. Cependant, vous pouvez utiliser certains processeurs de texte comme awk et faire ce que vous voulez:

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

Cela prend le résultat de ps, puis pour chaque ligne sauf la première, il remplace la 5e colonne qui est normalement en Ko, en Mo en ajoutant le suffixe M.

Vous pouvez en faire un alias et le stocker dans le fichier . Bashrc pour pouvoir l'appeler par quelque chose comme myps.

La plupart des gens demandent comment conserver le format ou utiliser d'autres unités et précision.

Pour une version simple, vous pouvez utiliser le filtre de sortie column -t:

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

Cependant, cela ne reconnaît pas correctement les espaces dans la dernière colonne. Malheureusement, nous devons gérer le formatage du texte et préparer notre propre chaîne de format au format printf.

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);}'

Explication:

  • La condition NR==1 Concerne uniquement la première ligne (en-tête). Nous utilisons la sortie ps d'origine pour déterminer où COMMAND commence:
    • o=$0 Stocke toute la ligne non modifiée afin que nous puissions l'utiliser plus tard
    • a=match($0,$11) trouve l'emplacement du 11ème champ (qui devrait être l'endroit où la colonne COMMAND commence dans la sortie d'origine)
  • NR>1 Est pour les lignes suivantes (données). Nous changeons le 5ème champ:
    • $5=int(10*$5/1024)/10"M" change la valeur en mégaoctets avec une décimale et ajoute le suffixe "M".
    • printf affiche tous les champs sous forme de colonne:
      • %-10s Signifie s pour la chaîne, 10 Pour 10 caractères de large, - Pour l'alignement à gauche
      • %8s Signifie s pour la chaîne, 8 Pour 8 caractères de large, et en raison de l'absence de - La sortie de ce champ est alignée à droite.
    • substr(o, a) prend la sous-chaîne de la ligne d'origine (d'où o stockée avant) à partir de la position a calculée dans la condition précédente, afin que nous puissions afficher la sortie de la commande avec des espaces préservés.
19
DevilaN