Невозможно записать диагностический вывод из mpg123 во время работы программы - PullRequest
0 голосов
/ 11 июня 2018

Я хочу вызвать mpg123 из PHP (используя exec) и отслеживать диагностический вывод, сгенерированный программой во время ее работы.

Я искал в Интернете и не могу найти какой-либо способсм. перенаправленный вывод программы командной строки во время ее работы.

Вместо этого выходной файл всегда записывается ПОСЛЕ завершения процесса, но мне нужно получить доступ к выводу, пока он еще работает, поэтому мой вопрос.

Тестирование с:

mpg123.exe http://148.251.184.14:8192/stream | tee.exe streaming.txt

... файл streaming.txt` всегда пуст во время выполнения exe.

[Примечание редактора: mpg123 отправляет диагностический вывод на stderr].

Кроме того, я проверял это:

mpg123.exe http://148.251.184.14:8192/stream > streaming.txt

... и все равно не повезло, потому что файл streaming.txt всегда остается пустым, а mpg123 все еще работает.

[Примечание редактора: конечно, по той же причине, что и выше, команда должна быть:

mpg123.exe http://148.251.184.14:8192/stream 2> streaming.txt

Но вы все равно ничего не видите в файле streaming.txt до тех пор, пока программа не завершится.

end note]

Есть ли способ сделать это?Кажется, это крепкий орешек или даже невозможен ... Спасибо за любую помощь.

PS:

Использование статического двоичного файла из: https://mpg123.de/download/win64/1.25.10/

Tee.exe: https://sourceforge.net/projects/unxutils/files/unxutils/current/

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Возможно, можно использовать «тройник», уже установленный на машине.У меня нет исполняемого файла mpg123.exe, поэтому я не могу его протестировать.

powershell -NoProfile -Command "& mpg123.exe [StreamURL] | Tee-Object -FilePath .\streaming.txt"

Редактировать

Исходя из информации @AlexP о том, что mpg123.exe пишет в stderr, я быпопробуй:

powershell -NoProfile -Command "& mpg123.exe [StreamURL] 2>&1 | Tee-Object -FilePath .\streaming.txt"
0 голосов
/ 12 июня 2018

Я решил удалить свой первоначальный ответ и опубликовать новый, потому что, хотя старый был на самом деле правильным, он не очень хорошо отвечал на вопрос.Теперь, когда я понимаю, что ОП на самом деле делает , я могу ответить на этот вопрос правильно.

Вопрос на самом деле очень прост.Большинство программ, особенно программ командной строки, на большинстве платформ содержат логику, чтобы определить, был ли перенаправлен stdout или stderr в файл (> file) или канал (например, | tee).Эта логика обычно фактически скрывается в библиотеке времени выполнения, поэтому программы получают ее бесплатно, поэтому почти все они делают это, и я уверен, что это верно для mpg123, который является относительно простым зверем.То, что я скажу ниже, будет применяться почти к любой программе.

Теперь, что эта логика делает, чтобы решить, следует ли буферизовать выводить в stdout / stderr (это может сделатьдругое решение для каждого).Если вывод идет непосредственно на консоль (или, в Unix, на терминал), он вообще не буферизуется (или, возможно, только для каждой строки).Все отправляется в значительной степени, как только программа его генерирует.

Если, с другой стороны, вывод перенаправлен , тогда mpg123 обнаруживает это и записывает данные в виде кусков (часто 4k чанков) и , если общий объем вывода, сгенерированного во время работы программы, меньше размера буфера , тогда вы не увидите ничего в выходном файле или канале, пока программа не завершится,в этот момент буфер очищается, а файл закрывается (так что вы видите его тогда, как отметил OP).

Теперь, зная все это, мы можем объяснить поведение, которое OP наблюдает при запуске mpg123,На самом деле это не связано с каким-либо запутанным жонглированием, которое mpg123 может делать с дескрипторами файлов, а изменение поведения при добавлении в -v является лишь побочным эффектом.То, что вы видите, является прямым результатом другой стратегии буфера, используемой при перенаправлении вывода.

Итак, используя двоичный файл, связанный с OP, эта команда:

mpg123 http://148.251.184.14:8192/stream

Генерируетследующий вывод на консоль сразу (потому что ничего не буферизируется):

High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.25.10; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Directory: http://148.251.184.14:8192/
Playing MPEG stream 1 of 1: stream ...
ICY-NAME: Chroma Metal
ICY-URL: http://chromaradio.com

MPEG 1.0 L III cbr128 44100 j-s

ICY-META: StreamTitle='Avantasia - The Seven Angels';

Затем он продолжает воспроизводить поток через звуковую карту, что занимает довольно много времени.Приведенная выше информация записывается в stdoutmpg123 всегда записывает диагностическую информацию в stdout).

Эта команда, однако, ведет себя по-разному, поскольку выходные данные буферизуются (обратите внимание на перенаправление stdout):

mpg123 http://148.251.184.14:8192/stream 2>x.txt

Как отмечено OP, при создании потока создается файл нулевой длины, поскольку общий объем диагностического вывода помещается во внутренний буфер mpg123 s , поэтому он остается там до тех пор, пока программа не завершится, после чего выходные данные должным образом включаются в файл по указанной выше причине.

И, наконец, эта команда с добавленным в * параметром -v:

mpg123 -v http://148.251.184.14:8192/stream 2>x.txt

создает некоторые выходные данные в x.txt во время работы программы , поскольку буфер заполняется дополнительной диагностической информацией, которую генерирует флаг -v и в этот момент mpg123 должен записать его на диск.Флаг -v означает verbose.Отсюда и дополнительный вывод.

Обратите внимание, что когда вы делаете это, данные в файле по-прежнему всегда немного отстают (потому что следующий полный буфер накапливается и не будет выводиться доон полон), поэтому добавление -v может дать вам то, что вы хотите (или, по крайней мере, некоторые из них), но это не изменило основной проблемы.Вы можете увидеть это довольно ясно, если вы запустите указанную выше команду в одном окне консоли и tail -F x.txt в другом.Когда вы делаете это, ничего не появляется в течение первых 5 секунд или около того.Затем появляется некоторый (частичный) вывод и так далее.

Так что я надеюсь, что все прояснится.Windows и Unix ведут себя примерно одинаково в этом отношении.Я отредактирую вопрос ОП, чтобы сделать его немного менее запутанным.Сейчас немного неопрятно.

0 голосов
/ 11 июня 2018

Например, вы можете получить tail из GnuWin32 (он находится в пакете coreutils ).Затем:

  • В одном окне командной строки запустите tail -F output-file.Это будет изначально сидеть там, потому что output-file еще нет.Оставьте его.

  • В другом окне командной строки запустите your-command > output.file.

  • В первом окне командной строки tail отобразитсодержимое output-file в том виде, в котором оно было сгенерировано.

Примечание 1. Программа your-command может буферизовать свои выходные данные, чтобы они записывались в виде фрагментов.Некоторые программы имеют опции для минимизации буферизации вывода, например, sed -u или grep --line-buffered.

Примечание 2: tail работает так быстро, как может, но вывод консоли довольно медленный в Windows.Для программы вполне возможно генерировать вывод намного быстрее, чем tail.

Я протестировал эту процедуру с dir /s C:\ > Ls-lR.txt и tail Ls-lR.txt.

Причуды MPG123

Конкретная программа, которую хочет отслеживать Querent, - MPG123.Эта программа:

  • Обычно не выполняет запись в стандартный вывод, и фактически закрывает стандартный вывод, если не хочет записывать данные WAV.

  • Записывает диагностические сообщения в стандартную ошибку, но только если стандартная ошибка не перенаправляется или , предоставляется опция -v.

Итак ...

  • Откройте окно командной строки и введите tail -F mpg123.out.Поскольку файла с именем mpg123.out нет, tail будет сидеть и ждать.Дайте ему подождать.

     C> tail -F MPG123.out
    
  • Откройте второе окно командной строки и выполните mpg123

    • Перенаправление стандартной ошибки на mpg123.out, и

    • С опцией -v.

      C> mpg123.exe 2>MPG123.out -v "\path\to\the\music\file.mp3"
      
  • ВВ первом окне просмотрите диагностические сообщения MPG123.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...