Wie kann ich unter Linux sehen, wie weit sich ein Prozess in einer Datei befindet?


12

Wenn ich einen Pipe-Befehl wie

   cat myfile | processor_application

Ist es möglich zu sehen, wie weit die Datei cat durchlaufen hat, wenn processor_application etwas von standard in liest, in Blöcken zu verarbeiten ist?

Möglicherweise mit lsof?

Vielen Dank!


Vielen Dank für die bisherigen Antworten! Ich hätte jedoch klarer sein sollen: Der Befehl wird bereits ausgeführt.
Wodow

Ah ja, dann ist pv nicht so praktisch. Möglicherweise möchten Sie Ihre ursprüngliche Frage bearbeiten, um dies zu verdeutlichen.
Phil Hollenback

Tatsächlich gibt es in dieser Frage jetzt drei großartige, separate Antworten, also werde ich es so lassen, wie es ist.
Wodow

1
Zusammenfassend sind dies: 1. Verwenden Sie pv (bevor Sie beginnen) 2. Verwenden Sie lsof -o (wenn Offsets unterstützt werden) 3. Sehen Sie sich den Wert von wchar on / proc / <PID> / io für die bekannte PID der Katze an process
wodow

Antworten:


12

Sie können dazu pv verwenden , z

pv file | processor_application

Da pv übergibt, ist es stdin direkt zu es stdout, das Sie Katze nicht benutzen müssen.

Bearbeiten Wenn Ihr Programm bereits ausgeführt wird, suchen Sie die PID des catProzesses und sehen Sie sich den Inhalt von an

/proc/<PID>/io

was Ihnen sagt, wie viele Bytes es geschrieben hat - wchar.


Ich habe gerade deine Bearbeitung gesehen! Dies funktioniert perfekt, wenn (i) pv in der Kette fehlt und (ii) lsof -o funktioniert. Vielen Dank!
Wodow

9

Absolut! Pipe Viewer macht genau das. Fügen Sie es einfach in Ihre Pipeline ein:

cat myfile | pv | processor_application

Sie können catim obigen Beispiel Folgendes optimieren :

pv myfile | processor_application

Dies hat den Vorteil, dass ein tatsächlicher Fortschrittsindikator bereitgestellt wird, da pv die Größe der Eingabe direkt bestimmen kann. Wenn Sie pv in der Mitte einer Pipeline verwenden, müssen Sie die Dateigröße selbst angeben, um einen genauen Fortschritt zu erzielen:

input_process | pv -s 100M -p | processor_application

Weitere Optionen zum Anpassen von pv finden Sie auf der Website.


Ich mag, pvwenn es verfügbar ist :-)
voretaq7

Das Einfügen pvin eine Pipeline mit mkfifound ist relativ einfach gdb(vier Systemaufrufe mit GDBs p).
user1686

@grawity du kannst dich nicht so ärgern. Schreiben Sie eine echte Antwort auf und demonstrieren Sie - ich bin jetzt sehr neugierig.
Phil Hollenback

2
Zu viel Hack, um eine Antwort zu sein, aber hier.
user1686

6

Wenn der Prozess bereits ausgeführt wird, enthält lsof eine size/offsetSpalte, die für Sie hilfreich sein kann. Ermitteln Sie die PID des Cat-Prozesses, den Sie überprüfen möchten, und klicken Sie dann auf OK lsof -o -p [PID].

Wenn der Prozess noch nicht ausgeführt wird, ist dies, pvwie von anderen vorgeschlagen, eine gute Option (vorausgesetzt, Ihr System verfügt über dieses Dienstprogramm).


Dies ist die Option, die ich mir angesehen hatte. Aber: Was ist, wenn lsof -o auf dem System nicht zulässig oder nicht verfügbar ist?
Wodow

Wenn -oes auf Ihrem System nicht funktioniert, sind Sie meiner Meinung nach ziemlich durchgeknallt in Bezug auf die Verwendung von lsof: - / (Ich nehme an, Sie führen lsof als den Benutzer aus, der den catProzess gestartet hat, oder als root?)
voretaq7

Ja, ich habe beide ausprobiert. Ich bin auf der Suche nach Gründen lsof warnt -o als
derzeit

Die lsof-FAQ, gespiegelt unter gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , impliziert in point / question 3.43.2.3, dass lsof -o unter Linux nicht möglich ist! Ich
gehe
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.