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!

wodow
quelle
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.

Iain
quelle
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.

Phil Hollenback
quelle
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).

voretaq7
quelle
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