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

11

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 le ls -s --human-readablefait?

balki
la source
1
L'absence de mention dans man psme suggère qu'il n'y a pas une telle option intégrée.
Ulrich Schwarz

Réponses:

20

AFAIK vous ne pouvez pas y parvenir simplement par une pscommande pure avec des options. Cependant, vous pouvez utiliser certains processeurs de texte comme awket faire faire ce que vous voulez:

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

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

Vous pouvez en faire un alias et le stocker dans un fichier .bashrc afin de 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 column -tfiltre de sortie:

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 formatage au printfformat similaire.

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:

  • NR==1la condition 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>1est pour les lignes suivantes (données). Nous changeons le 5ème domaine:
    • $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:
      • %-10ssignifie spour chaîne, 10pour 10 caractères de large, -pour alignement à gauche
      • %8ssignifie spour chaîne, 8pour 8 caractères de large, et en raison de l'absence de -sortie de ce champ est aligné à droite.
    • substr(o, a)prend la sous-chaîne de la ligne d'origine (donc ostockée avant) à partir de la position acalculée dans la condition précédente, afin que nous puissions afficher la sortie de la commande avec des espaces préservés.
DevilaN
la source
3
Modifié pour GB et avec 2 décimales (par exemple 1.23GB):ps aux | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
mahemoff
1
est-il possible d'atteindre le même objectif en préservant la psmise en forme? Les onglets sont complètement enlevés avecawk
Chris
Je vois que vous diffusez en tant qu'int, est-il possible de l'avoir en décimal comme 1,2M?
JavaSheriff
Pourquoi les onglets sont manquants?
Alex78191
@ Alex78191: Ajout d'une commande alternative pour le formatage avec une sortie de type tableau
DevilaN