web-dev-qa-db-fra.com

Comment capturer la sortie d'une commande supérieure dans un fichier sous Linux?

Je veux écrire la sortie d'une commande "top" spécifique dans un fichier. J'ai fait quelques recherches sur Google et j'ai découvert que cela peut être fait en utilisant la commande suivante.

top -n 10 -b > top-output.txt

où -n est pour spécifier le nombre d'itérations et -b est pour le mode batch. Cela fonctionne très bien si laissé en haut pour les 10 itérations. Mais si je romps l'exécution de la commande avec un Ctrl-C, le fichier de sortie semble être vide.

Je ne connais pas le nombre d'itérations à l'avance, j'ai donc besoin de le casser manuellement. Comment puis-je capturer la sortie de top dans un fichier sans spécifier d'itérations?

La commande que j'essaie d'utiliser précisément est

top -b | grep init > top-output.txt

et le casser quand je veux. Mais ça ne marche pas.

EDIT: Pour donner plus de contexte à la question, j'ai un Java Code qui invoque un outil avec un fichier d'entrée. Comme dans l'outil prend un fichier en entrée et s'exécute pendant un certain temps, puis prend le fichier suivant et ainsi de suite. J'ai un ensemble de 100 000 fichiers qui doivent être introduits dans l'outil. Alors maintenant, j'essaie de surveiller cet outil spécifique (il fonctionne comme un processus sous Linux). Je ne peux pas capturer l'ensemble de "top" les données sous forme de fichier car elles seraient trop volumineuses avec des données indésirables. Comment capturer les statistiques système de ce processus et les écrire dans un fichier en utilisant top?

31
Pradep

pour moi top -b > test.txt stockera toutes les sorties de top ok même si je les casse avec ctrl-c. Je vous suggère de vider d'abord, puis grep le fichier résultant.

35
Markus Mikkolainen

Que diriez-vous d'utiliser while loop et -n 1:

while sleep 3; do 
  top -b -n1 | grep init > top-output.txt
done
8
Thor

Il semble que la sortie n'écrive pas dans le fichier tant que toutes les itérations ne sont pas terminées. Vous pouvez résoudre ce problème en encapsulant avec une boucle externe comme celle-ci:

touch top-output.txt
while true; do
    top -b | grep init >> top-output.txt
done
4
CIGuy

Voici le 1-liner que j'aime utiliser sur mon mac:

top -o -pid -l 1 | grep "some regexp"

À votre santé.

1
jb1

CTRL + C n'est pas une solution idéale en raison des séjours de contrôle dans CLI. Vous pouvez utiliser la commande ci-dessous qui sauvegarde la sortie supérieure dans un fichier:

top -n 1 -b > top-output.txt
1
Jitesh Sojitra

Comme indiqué par @Thor dans un commentaire, il vous suffit de vous assurer que grep ne met pas en mémoire tampon arbitrairement mais par ligne avec le --line-buffered option:

top -bn 10 | grep 'init' --line-buffered | tee top-output.txt

Sans grep, la redirection de la sortie de top vers un fichier fonctionne très bien, interruption incluse.

0
Campa

Si vous souhaitez exécuter la commande supérieure en arrière-plan (ne vous inquiétez pas de la déconnexion/veille, etc.) - vous pouvez utiliser Nohup ou un travail par lots ou cron ou écran.

Utilisation de Nohup (signifie: No Hang Up):

Supposons que vous enregistriez la commande supérieure dans un fichier appelé top-exec.sh avec le contenu suivant:

 top -p <PID> -b > /tmp/top.log

Vous pouvez remplacer la commande top pour le processus qui vous intéresse. Ensuite, vous pouvez exécuter top-exec.sh en utilisant Nohup comme suit:

$> Nohup top-exec.sh &

Cela redirigera toutes les sorties de la commande top vers un fichier nommé "top.log".

J'ai eu exactement le même problème ...

voici ma ligne:

top -b -u myUser | grep -v Prog.sh | grep Prog > myFile.txt

Cela créerait myFile.txt mais il serait vide lorsque je le ferais Ctrl + C'd. Donc, après avoir lancé ma commande supérieure, j'ai commencé un deuxième processus supérieur. Lorsque j'ai trouvé le PID du premier sommet (a fait quelques essais et erreurs) et que je l'ai tué par le deuxième sommet, le premier sommet a écrit dans le fichier comme prévu.

J'espère que ça t'as aidé!

0
user320781

Résolu ce problème. Cela fonctionne même si vous appuyez sur Ctrl + c Même j'étais confronté au même problème lorsque je voulais enregistrer Cpu%. Exécutez ce script Shell:

#!/bin/sh
while true; do
    echo "$(top -b -n 1 | grep init)"  | tee -a top-output.log
    sleep 1
done
  • Vous pouvez grep tout ce que vous voulez extraire de la commande supérieure, utilisez ce script pour le stocker dans un fichier.
  • - b: fonctionnement en mode batch Démarre top en mode batch, ce qui peut être utile pour envoyer la sortie de top vers d'autres programmes ou vers un fichier. Dans ce mode, top n'acceptera pas d'entrée et s'exécute jusqu'à ce que la limite d'itérations que vous avez définie avec l'option de ligne de commande -n ou jusqu'à ce qu'il soit tué.
  • - nombre n, cette option spécifie le nombre maximal d'itérations, ou de trames, que top doit produire avant de se terminer. Ici, j'ai utilisé - n 1.
  • Faire man top pour plus de détails
  • tee -a permet à la sortie d'être visible sur la console et stocke également la sortie dans le fichier. L'option -a ajoute la sortie au fichier.
  • Ici, j'ai donné un intervalle de 1 seconde. Vous pouvez mentionner tout autre intervalle.

Source pour les explications de -b et -n: pages de manuel

man top

Kruthika

0
Kruthika C S