0
votes

Comment stocker la sortie de "watch" dans un fichier?

J'essaye d'afficher la progression de l'état d'un fichier copié avec la commande dd: J'exécute cette commande: dd if = / dev / zero of = file.txt count = 1024 bs = 10485760

Puis dans un autre terminal, j'exécute cette commande pour afficher l'état de progression: watch -n 1 kill -USR1 $ pid_dd

Mon problème J'ai essayé de rediriger la sortie de watch vers un fichier mais sans succès.

J'ai essayé cette solution proposée sur ce lien Comment enregistrer la sortie de "watch" pour file

while true
do
   watch -n 1 kill -USR1 $pid_dd | tee -a output_watch.txt
   sleep 2
done

Je ne sais pas comment rediriger la sortie de cette commande vers un fichier. Ma solution ne fonctionne pas.


2 commentaires

Dans votre question liée, il indique spécifiquement "Vous pouvez essayer ceci sans montre, si les 60 secondes exactes ne sont pas un problème:" donc coller watch à l'intérieur de cette boucle est une mauvaise idée. Exécutez simplement votre commande kill -USR1 $ pid_dd à l'intérieur de cette boucle avec le tube vers tee sans la montre . Essentiellement, vous ne voulez pas imprimer la sortie de watch dans un fichier car il est censé écrire à l'écran et il est criblé de déchets non imprimables pour rendre cela possible.


Merci beaucoup pour votre réponse. J'ai essayé cette boucle sans la commande "watch", mais le fichier de sortie est vide:


3 Réponses :


0
votes

J'ai testé cette boucle ci-dessus sans la commande "watch" comme ceci:

while true
do
  kill -USR1 $pid_dd | tee -a output_watch.txt
  sleep 2
done

Le problème est que le fichier "output_watch.txt" est vide. Je ne comprends pas pourquoi.


0 commentaires

0
votes

kill -USR1 $ pid_dd ne produit rien . Vous avez en effet capturé avec succès sa sortie, qui est vide. Il envoie un signal qui amène le processus dd - un processus entièrement différent - à afficher des données de progression sur son stderr, que vous n'avez pas redirigé.

Si vous redirigez simplement dd ... 2> & 1 | tee -a file il sera plus difficile de déterminer le PID de dd dont vous avez besoin. En fonction de votre shell, envisagez plutôt

dd ... 2> >(tee -a file) & pid=$!

watch -n1 kill -USR1 $pid
# you don't need a loop around watch, it already _is_ a loop

# or _instead_
while kill -USR1 $pid; do sleep 1; done

Sinon, consultez pv qui fait déjà presque ce que vous voulez (si disponible). Bien que décrit comme surveillant la copie de données d'un processus à un autre, il effectue en fait stdin vers stdout qui peuvent (les deux) être des fichiers au lieu de processus canalisés.


0 commentaires

0
votes

Exactement @dave_thompson! Cela fonctionne, j'ai écrit ce code:

dd ... 2>>/home/file.txt & pid_dd=$!
watch -n 1 kill -USR1 $pid_dd

Le fichier "file.txt" contient toutes les informations sur la progression du dd.

Merci beaucoup.


0 commentaires