W systemie Linux, jak mogę sprawdzić, jak daleko plik znajduje się w procesie?

13

Jeśli mam polecenie potokowe, takie jak

   cat myfile | processor_application

gdzie aplikacja_procesora odczytuje ze standardowego fragmentu, w kawałkach, do przetworzenia, czy można zobaczyć, jak daleko plik ma kot?

Być może używasz lsof?

Dzięki!

wodow
źródło
Dziękujemy za dotychczasowe odpowiedzi! Powinienem jednak być bardziej zrozumiały: polecenie już działa.
wodow
Ach tak, to PV nie jest tak przydatne. Możesz zredagować swoje oryginalne pytanie, aby było bardziej jasne.
Phil Hollenback,
Właściwie w tym pytaniu są teraz trzy osobne odpowiedzi, więc zostawię je bez zmian.
wodow
1
Podsumowując, są to: 1. Użyj pv (zanim zaczniesz) 2. Użyj lsof -o (jeśli obsługiwane są przesunięcia) 3. spójrz na wartość wchar na / proc / <PID> / io, dla znanego PID kota proces
wodow

Odpowiedzi:

13

Możesz to zrobić np. Za pomocą pv

pv file | processor_application

Gdy pv przechodzi, stdin przechodzi bezpośrednio na stdout, więc nie musisz używać cat.

Edytuj Ponieważ twój program jest już uruchomiony, znajdź PID catprocesu, a następnie spójrz na zawartość

/proc/<PID>/io

który powie ci ile bajtów napisał - wchar.

Iain
źródło
Właśnie zobaczyłem twoją edycję! Działa to doskonale, biorąc pod uwagę brak (i) pv w łańcuchu, (ii) lsof -o. Dzięki!
wodow
9

Absolutnie! Pipe Viewer właśnie to robi. Po prostu wstaw go do swojego potoku:

cat myfile | pv | processor_application

Możesz zoptymalizować catpowyższy przykład:

pv myfile | processor_application

Ma to tę zaletę, że zapewnia rzeczywisty wskaźnik postępu, ponieważ pv może bezpośrednio określić rozmiar danych wejściowych. Jeśli używasz pv w środku potoku, musisz sam podać rozmiar pliku, aby uzyskać dokładne postępy:

input_process | pv -s 100M -p | processor_application

Sprawdź witrynę, aby uzyskać więcej opcji dostosowywania pv.

Phil Hollenback
źródło
Podoba mi się, pvgdy jest dostępny :-)
voretaq7
Jest raczej łatwo wstawić pvdo potoku za pomocą mkfifoi gdb(cztery wywołania systemowe z gdb p).
user1686,
@ Grawity, nie możesz się tak drażnić. Napisz prawdziwą odpowiedź i zademonstruj - jestem teraz bardzo ciekawy.
Phil Hollenback,
2
Zbyt duży hack, żeby być odpowiedzią, ale tutaj.
user1686,
6

Jeśli proces już działa, lsof ma size/offsetkolumnę, która może być dla Ciebie pomocna - znajdź PID procesu cat, który chcesz sprawdzić, a następnie lsof -o -p [PID].

Jeśli proces jeszcze się nie uruchomił, pvjak sugerują inni, to dobra opcja (zakładając, że twój system ma to narzędzie).

voretaq7
źródło
Jest to opcja lsof, na którą patrzyłem. Ale: co jeśli lsof -o nie jest dozwolone lub niedostępne w systemie?
wodow
Jeśli -onie działa w systemie Myślę, że dość dużo wkręca w odniesieniu do korzystania z lsof: - / (zakładam używasz lsof jako użytkownik, który uruchomił catproces lub jako root?)
voretaq7
Tak, wypróbowałem oba. Szukam powodów, dla których lsof ostrzega -o, ponieważ nie jest teraz dostępny ...
wodow 31.01.11
FAQ lsof , dublowany na gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , sugeruje w punkcie / pytaniu 3.43.2.3, że lsof -o nie jest możliwe w Linuksie! Zakładam, że jest to zbyt szerokie, ponieważ inni użytkownicy używają lsof -o
wodow