En Linux, ¿cómo puedo ver qué tan lejos está un proceso a través de un archivo?

12

Si tengo un comando canalizado como

   cat myfile | processor_application

donde procesador_aplicación es algo que se lee desde el estándar en, en fragmentos, para procesar, ¿es posible ver qué tan lejos ha llegado el archivo cat?

Posiblemente usando lsof?

¡Gracias!

wodow
fuente
¡Gracias por las respuestas hasta ahora! Sin embargo, debería haber sido más claro: el comando ya se está ejecutando.
wodow
Ah sí, entonces pv no es tan útil. Es posible que desee editar su pregunta original para que quede más clara.
Phil Hollenback
En realidad, hay tres grandes respuestas separadas en esta pregunta ahora, así que lo dejaré como está.
wodow
1
Resumiendo, son: 1. Use pv (antes de comenzar) 2. Use lsof -o (si se admiten las compensaciones) 3. mire el valor de wchar on / proc / <PID> / io, para conocer el PID conocido del gato proceso
wodow

Respuestas:

12

Puedes usar pv para hacer esto, por ejemplo

pv file | processor_application

A medida que el pv pasa, es stdin directamente a su stdout, no necesita usar cat.

Editar Como su programa ya se está ejecutando, busque el PID del catproceso y luego mire el contenido de

/proc/<PID>/io

que le dirá cuántos bytes ha escrito: wchar.

Iain
fuente
¡Acabo de ver tu edición! Esto funciona perfectamente dada la ausencia de (i) pv en la cadena, (ii) lsof -o trabajando. ¡Gracias!
wodow
9

¡Absolutamente! Pipe Viewer hace exactamente eso. Simplemente insértelo en su tubería:

cat myfile | pv | processor_application

Puede optimizar lejos caten el ejemplo anterior:

pv myfile | processor_application

Lo cual tiene la ventaja de proporcionar un indicador de progreso real, ya que pv puede determinar el tamaño de la entrada directamente. Si utiliza pv en el medio de una tubería, debe proporcionar el tamaño del archivo usted mismo para obtener un progreso preciso:

input_process | pv -s 100M -p | processor_application

Consulte el sitio web para obtener más opciones para personalizar pv.

Phil Hollenback
fuente
Me gusta pvcuando está disponible :-)
voretaq7
Es bastante fácil de insertar pven una tubería usando mkfifoy gdb(cuatro syscalls con gdb's p).
user1686
@grawity, no puedes bromear así. Escribe una respuesta real y demuestra: tengo mucha curiosidad ahora.
Phil Hollenback
2
Demasiado de un truco para ser una respuesta, pero aquí.
user1686
6

Si el proceso ya se está ejecutando, lsof tiene una size/offsetcolumna que puede serle útil: busque el PID del proceso cat que desea inspeccionar y luego lsof -o -p [PID].

Si el proceso aún no se está ejecutando, pvcomo otros sugirieron es una buena opción (suponiendo que su sistema tenga esa utilidad).

voretaq7
fuente
Esta es la opción lsof que había visto. Pero: ¿qué pasa si lsof -o no está permitido o no está disponible en el sistema?
wodow
Si -ono funciona en su sistema, creo que está bastante jodido con respecto al uso lsof: - / (Supongo que está ejecutando lsof como el usuario que inició el catproceso, o como root?)
voretaq7
Sí, probé ambos. Estoy buscando razones por las que lsof advierte -o como no está disponible ahora ...
wodow
Las preguntas frecuentes de lsof, reflejadas en gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , implican en el punto / pregunta 3.43.2.3 que ¡lsof -o no es posible en Linux! Supongo que esto es demasiado amplio, ya que otros usuarios parecen estar usando lsof -o
wodow el