Su Linux, come posso vedere quanto è lungo un file un processo?


12

Se ho un comando convogliato come

   cat myfile | processor_application

dove processor_application è qualcosa che legge dallo standard in, a pezzi, per elaborare, è possibile vedere quanto è arrivato il file cat?

Forse usando lsof?

Grazie!


Grazie per le risposte finora! Tuttavia, avrei dovuto essere più chiaro: il comando è già in esecuzione.
wodow,

Ah sì, allora il fotovoltaico non è così utile. Potresti voler modificare la domanda originale per renderlo più chiaro.
Phil Hollenback,

In realtà, ci sono tre grandi risposte separate in questa domanda ora, quindi la lascerò così com'è.
wodow,

1
Riassumendo, sono: 1. Usa pv (prima di iniziare) 2. Usa lsof -o (se sono supportati gli offset) 3. guarda il valore di wchar su / proc / <PID> / io, per il PID noto del gatto processo
wodow,

Risposte:


12

Puoi usare pv per fare questo ad es

pv file | processor_application

Quando pv passa il suo stdin direttamente al suo stdout, non è necessario usare cat.

Modifica Poiché il programma è già in esecuzione, trova il PID del catprocesso e guarda i contenuti di

/proc/<PID>/io

che ti dirà quanti byte ha scritto - wchar.


Ho appena visto la tua modifica! Questo funziona perfettamente data l'assenza di (i) pv nella catena, (ii) lsof -o working. Grazie!
wodow,

9

Assolutamente! Pipe Viewer lo fa esattamente. Basta inserirlo nella pipeline:

cat myfile | pv | processor_application

È possibile ottimizzare via catnell'esempio sopra:

pv myfile | processor_application

Il che ha il vantaggio di fornire un indicatore di progresso effettivo, poiché pv può determinare direttamente la dimensione dell'input. Se usi pv nel mezzo di una pipeline, devi fornire tu stesso le dimensioni del file per ottenere progressi accurati:

input_process | pv -s 100M -p | processor_application

Controlla il sito Web per ulteriori opzioni per personalizzare il pv.


Mi piace pvquando è disponibile :-)
voretaq7

È piuttosto facile da inserire pvin una pipeline usando mkfifoe gdb(quattro syscalls con gdb p).
user1686

@grawity non puoi scherzare così. Scrivi una vera risposta e dimostra - Sono molto curioso adesso.
Phil Hollenback,

2
Troppa incisione per essere una risposta, ma qui.
user1686

6

Se il processo è già in esecuzione lsof ha una size/offsetcolonna che può esserti utile: trova il PID del processo cat che desideri controllare e quindi lsof -o -p [PID].

Se il processo non è ancora in esecuzione, pvcome suggerito da altri è una buona opzione (supponendo che il sistema disponga di tale utilità).


Questa è l'opzione lsof che avevo visto. Ma: cosa succede se lsof -o non è consentito o non disponibile sul sistema?
wodow,

Se -onon funziona sul tuo sistema, penso che tu sia praticamente fregato per quanto riguarda l'utilizzo lsof: - / (suppongo che tu stia eseguendo lsof come l'utente che ha avviato il catprocesso o come root?)
voretaq7

Sì, ho provato entrambi. Sto cercando motivi per cui lsof avverte -o come non disponibile ora ...
wodow

Le FAQ di lsof, rispecchiate in gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , implicano nel punto / domanda 3.43.2.3 che lsof -o non è possibile su Linux! Presumo che questo sia troppo ampio, poiché altri utenti sembrano utilizzare lsof -o
wodow,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.