Sous Linux, comment puis-je voir à quelle distance d'un fichier se trouve un processus?

12

Si j'ai une commande canalisée comme

   cat myfile | processor_application

où application_processeur est quelque chose qui se lit à partir de la norme dans, en morceaux, pour traiter, est-il possible de voir jusqu'où le chat a parcouru le fichier?

Vous utilisez peut-être lsof?

Merci!

wodow
la source
Merci pour les réponses jusqu'à présent! Cependant, j'aurais dû être plus clair: la commande est déjà en cours d'exécution.
wodow
Ah oui, alors le pv n'est pas si pratique. Vous souhaiterez peut-être modifier votre question d'origine pour la rendre plus claire.
Phil Hollenback
En fait, il y a trois grandes réponses distinctes dans cette question maintenant, donc je vais la laisser telle quelle.
wodow
1
En résumé, ils sont: 1. Utilisez pv (avant de commencer) 2. Utilisez lsof -o (si les décalages sont pris en charge) 3. regardez la valeur de wchar sur / proc / <PID> / io, pour le PID connu du chat process
wodow

Réponses:

12

Vous pouvez utiliser pv pour ce faire, par exemple

pv file | processor_application

Lorsque pv passe, c'est stdin directement à sa sortie standard, vous n'avez pas besoin d'utiliser cat.

Modifier Comme votre programme est déjà en cours d'exécution, recherchez le PID du catprocessus, puis examinez le contenu de

/proc/<PID>/io

qui vous dira combien d'octets il a écrit - wchar.

Iain
la source
Je viens de voir votre montage! Cela fonctionne parfaitement étant donné l'absence de (i) pv dans la chaîne, (ii) lsof -o fonctionnant. Merci!
wodow
9

Absolument! Pipe Viewer fait exactement cela. Insérez-le simplement dans votre pipeline:

cat myfile | pv | processor_application

Vous pouvez optimiser loin catdans l'exemple ci-dessus:

pv myfile | processor_application

Ce qui a l'avantage de fournir un indicateur de progression réel, car pv peut déterminer directement la taille de l'entrée. Si vous utilisez pv au milieu d'un pipeline, vous devez fournir la taille du fichier vous-même pour obtenir une progression précise:

input_process | pv -s 100M -p | processor_application

Consultez le site Web pour plus d'options pour personnaliser pv.

Phil Hollenback
la source
J'aime pvquand il est disponible :-)
voretaq7
Il est assez facile à insérer pvdans un pipeline en utilisant mkfifoet gdb(quatre appels système avec gdb p).
user1686
@grawity vous ne pouvez pas taquiner comme ça. Écrivez une vraie réponse et démontrez - je suis très curieux maintenant.
Phil Hollenback
2
Trop de hack pour être une réponse, mais ici.
user1686
6

Si le processus est déjà en cours d'exécution, lsof a une size/offsetcolonne qui peut vous être utile - recherchez le PID du processus cat que vous souhaitez inspecter, puis lsof -o -p [PID].

Si le processus ne fonctionne pas encore, pvcomme d'autres l'ont suggéré, c'est une bonne option (en supposant que votre système dispose de cet utilitaire).

voretaq7
la source
C'est l'option lsof que j'avais étudiée. Mais: que faire si lsof -o n'est pas autorisé ou indisponible sur le système?
wodow
Si -ocela ne fonctionne pas sur votre système, je pense que vous êtes à peu près foutu en ce qui concerne l'utilisation lsof: - / (Je suppose que vous exécutez lsof en tant qu'utilisateur qui a lancé le catprocessus, ou en tant que root?)
voretaq7
Oui, j'ai essayé les deux. Je recherche des raisons pour lesquelles lsof prévient -o car non disponible maintenant ...
wodow
La FAQ lsof, reflétée à gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , implique au point / question 3.43.2.3 que lsof -o n'est pas possible sous Linux! Je suppose que c'est trop large, car d'autres utilisateurs semblent utiliser lsof -o
wodow