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.
3 Réponses :
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.
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.
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.
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 commandekill -USR1 $ pid_dd
à l'intérieur de cette boucle avec le tube verstee
sans lamontre
. Essentiellement, vous ne voulez pas imprimer la sortie dewatch
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: