No Linux, como posso ver até que ponto um processo está em um arquivo?

12

Se eu tiver um comando canalizado, como

   cat myfile | processor_application

onde application_do_processador é algo que lê do padrão em, em pedaços, para processar, é possível ver até que ponto o arquivo cat chegou?

Possivelmente usando lsof?

Obrigado!

wodow
fonte
Obrigado pelas respostas até agora! No entanto, eu deveria ter sido mais claro: o comando já está sendo executado.
Wodow 31/01
Ah sim, então pv não é tão útil. Você pode editar sua pergunta original para deixar isso mais claro.
Phil Hollenback
Na verdade, existem três ótimas respostas separadas nesta pergunta agora, então vou deixar como está.
Wodow 31/01
1
Resumindo, são eles: 1. Use pv (antes de começar) 2. Use lsof -o (se houver suporte para compensações) 3. observe o valor do wchar em / proc / <PID> / io, para o PID conhecido do gato processo
wodow 31/01

Respostas:

12

Você pode usar o pv para fazer isso, por exemplo

pv file | processor_application

Quando o pv passa, é stdin diretamente para o stdout, e você não precisa usar o cat.

Editar Como seu programa já está sendo executado, localize o PID do catprocesso e verifique o conteúdo de

/proc/<PID>/io

que lhe dirá quantos bytes ele escreveu - wchar.

Iain
fonte
Acabei de ver sua edição! Isso funciona perfeitamente, dada a ausência de (i) pv na cadeia, (ii) lsof -o trabalho. Obrigado!
Wodow 31/01
9

Absolutamente! Tubulação Visualizador faz exactlty isso. Basta inseri-lo no seu pipeline:

cat myfile | pv | processor_application

Você pode otimizar cato exemplo acima:

pv myfile | processor_application

Qual tem a vantagem de fornecer um indicador de progresso real, já que o pv pode determinar diretamente o tamanho da entrada. Se você usar o PV no meio de um pipeline, precisará fornecer o tamanho do arquivo para obter um progresso preciso:

input_process | pv -s 100M -p | processor_application

Verifique o site para mais opções para personalizar o pv.

Phil Hollenback
fonte
Eu gosto pvquando está disponível :-)
voretaq7 31/01
É bastante fácil inserir pvum pipeline usando mkfifoe gdb(quatro syscalls com gdb's p).
precisa saber é o seguinte
@ Grarawity você não pode provocar assim. Escreva uma resposta real e demonstre - estou muito curioso agora.
Phil Hollenback
2
Muito hack para ser uma resposta, mas aqui.
usar o seguinte comando
6

Se o processo já estiver em execução, lsof possui uma size/offsetcoluna que pode ser útil para você - encontre o PID do processo do gato que deseja inspecionar e, em seguida lsof -o -p [PID].

Se o processo ainda não estiver em execução, pvcomo sugerido por outros, é uma boa opção (supondo que seu sistema tenha esse utilitário).

voretaq7
fonte
Esta é a opção lsof que eu havia analisado. Mas: e se lsof -o não for permitido ou indisponível no sistema?
Wodow 31/01
Se -onão funciona em seu sistema Eu acho que você está muito bem parafusado no que diz respeito ao uso de lsof: - / (eu suponho que você está correndo lsof como o usuário que lançou o catprocesso, ou como root?)
voretaq7
Sim, tentei os dois. Eu estou procurando por razões que lsof adverte -o como não está disponível agora ...
wodow 31/01
O FAQ do lsof, espelhado em gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , implica no ponto / pergunta 3.43.2.3 que o lsof -o não é possível no Linux! Eu suponho que este é mais ampla, como outros usuários parecem estar usando lsof -o
wodow