На Linux, как я могу увидеть, как далеко через файл процесс?

12

Если у меня есть команда, такая как

   cat myfile | processor_application

где CPU_application - это что-то, читающее из стандартного, в блоках, для обработки, возможно ли увидеть, как далеко прошел файл cat?

Возможно, с помощью lsof?

Благодарность!

wodow
источник
Спасибо за ответы до сих пор! Тем не менее, я должен был быть более понятным: команда уже выполняется.
Вдова
Ах да, тогда пв не очень удобно. Вы можете отредактировать исходный вопрос, чтобы сделать его более понятным.
Фил Холленбек
На самом деле, сейчас есть три отличных ответа на этот вопрос, поэтому я оставлю все как есть.
Вдова
1
Подводя итог, они: 1. Используйте pv (перед началом) 2. Используйте lsof -o (если смещения поддерживаются) 3. посмотрите значение wchar в / proc / <PID> / io, для известного PID кошки процесс
вдова

Ответы:

12

Вы можете использовать PV, чтобы сделать это, например,

pv file | processor_application

Когда pv передает свой стандартный вывод прямо в стандартный вывод, вам не нужно использовать cat.

Редактировать Поскольку ваша программа уже запущена, найдите PID catпроцесса, а затем посмотрите на содержимое

/proc/<PID>/io

который скажет вам, сколько байтов он написал - wchar.

иан
источник
Я только что видел твою правку! Это прекрасно работает, учитывая отсутствие (i) pv в цепочке, (ii) lsof -o работает. Благодарность!
Вдова
9

Абсолютно! Pipe Viewer делает это точно. Просто вставьте его в свой конвейер:

cat myfile | pv | processor_application

Вы можете оптимизировать catв приведенном выше примере:

pv myfile | processor_application

Который имеет преимущество в предоставлении фактического индикатора прогресса, так как pv может напрямую определять размер ввода. Если вы используете pv в середине конвейера, вам нужно указать размер файла самостоятельно, чтобы получить точный прогресс:

input_process | pv -s 100M -p | processor_application

Проверьте веб-сайт для получения дополнительных параметров для настройки PV.

Фил Холленбек
источник
Мне нравится, pvкогда это доступно :-)
voretaq7
Вставить pvв конвейер довольно просто , используя mkfifoи gdb(четыре системных вызова с GDB p).
user1686
@ Grawity вы не можете так дразнить. Напишите реальный ответ и продемонстрируйте - мне очень любопытно сейчас.
Фил Холленбек
2
Слишком много взлома, чтобы быть ответом, но здесь.
user1686
6

Если процесс уже запущен, у lsof есть size/offsetстолбец, который может быть вам полезен - найдите PID процесса cat, который вы хотите проверить, а затем lsof -o -p [PID].

Если процесс еще не запущен, pvкак предложили другие, это хороший вариант (при условии, что ваша система имеет эту утилиту).

voretaq7
источник
Это вариант lsof, на который я смотрел. Но: что если lsof -o не разрешен или недоступен в системе?
Вдова
Если -oв вашей системе не работает, я думаю, что вы в значительной степени не уверены в использовании lsof: - / (я предполагаю, что вы запускаете lsof как пользователь, запустивший catпроцесс, или как root?)
voretaq7
Да, пробовал оба. Я ищу причины, по которым lsof предупреждает: o сейчас недоступно ...
wodow
Часто задаваемые вопросы по lsof, отраженные по адресу gd.tuwien.ac.at/utils/admin-tools/lsof/FAQ , подразумевают в пункте / вопросе 3.43.2.3, что lsof -o невозможна в Linux! Я предполагаю, что это слишком широко, так как другие пользователи, похоже, используют lsof -o
wodow