7 votes

Regarder coupe la sortie ps aux lorsqu'elle est dirigée vers un autre programme

En travaillant sur un script (Python) qui n'a pas d'importance ici, je suis tombé sur un comportement très étrange impliquant watch et ps aux, lorsque ce dernier est redirigé vers autre chose.

J'ai réussi à réduire le problème à une seule ligne. Lorsque vous exécutez

watch "ps aux | grep 'ps aux'"

dans un terminal, vous obtenez généralement plusieurs lignes de sortie, comme prévu.

sortie montrant 5 résultats

Remarquez que les trois premières lignes sont coupées et correspondent tout juste à ps aux à la fin. Lorsque vous réduisez la taille de votre terminal, la sortie est complètement coupée des résultats.

sortie montrant 2 résultats

Cela signifie que grep ne reçoit que la sortie coupée. Ce qui me semble le plus déconcertant à ce sujet, c'est l'étendue extrêmement limitée pour laquelle cela se produit. Cela ne se produit pas pour l'une ou l'autre de

ps aux | grep "ps aux"
watch "ps u -C ps"
watch "ssh localhost 'ps aux | grep \"ps aux\"'"

Dans tous ces cas, la liste est renvoyée comme prévu.

Cela semble être le cas à la fois pour bash et sh, sur Ubuntu 15.04.

Alors que j'ai réussi à contourner ce problème dans mon script, est-ce que quelqu'un a une explication pour ce comportement?

7voto

muru Points 180007

Démons nasaux.1

man ps dit (mise en emphase de ma part):

comm       COMMANDE   nom de la commande (seulement le nom de l'exécutable).
                     Les modifications apportées au nom de la commande ne seront pas
                     affichées.  Un processus marqué  est partiellement
                     mort, en attente d'être entièrement détruit par son
                     parent.  La sortie de cette colonne peut contenir
                     des espaces.  (alias ucmd, ucomm).  Voir aussi l'option
                     de format args, l'option -f et l'option c.
                     Lorsqu'elle est spécifiée en dernier, cette colonne s'étendra
                     jusqu'au bord de l'écran.  Si ps ne peut pas déterminer
                     la largeur de l'affichage, par exemple lorsque la sortie est redirigée
                     (piped) vers un fichier ou une autre commande, la
                     largeur de la sortie est indéterminée (elle peut être de 80,
                     illimitée, déterminée par la variable TERM, etc).  La variable d'environnement COLUMNS ou
                     l'option --cols peut être utilisée pour déterminer précisément
                     la largeur dans ce cas.  L'option w ou -w peut également
                     être utilisée pour ajuster la largeur.

En effet, définir manuellement la variable COLUMNS aide:

watch "ps aux | grep 'ps aux'"

entrez la description de l'image ici

COLUMNS=2000 watch "ps aux | grep 'ps aux'"

entrez la description de l'image ici

1Même si nous ne parlons pas d'un compilateur C...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X