Как выделить термины в выходных данных, которые обновляются в реальном времени?

Перенаправление локального порта

ssh создает дополнительный локальный порт, который будет перенаправлен на порт в удаленной системе.

example

ssh -L 8080:127.0.0.1:80 user@webserver

Затем в вашем браузере по локальному URL-адресу http: // localhost: 8080 /

он подключится к порту 8080 локальных машин, который ssh ​​перенаправит на удаленный ssh, и он будет затем отправьте запрос на 127.0.0.1:80 . Примечание 127.0.0.1 на самом деле является локальным хостом удаленного сервера, но это мог быть хост / IP, доступный в сети удаленного компьютера.

Удаленная пересылка

Запрашивает ssh создать порт прослушивания на удаленной машине, который он будет пересылать назад (в обратном направлении) на локальный ssh ​​для пересылки.

ssh -R 10123:127.0.0.1:123 user@webserver

Итак, после того, как ssh подключается к веб-серверу, удаленный ssh ​​создает и lsitens на порту 10123. Процесс на веб-сервере, подключающийся к 10123, ssh забирает его и отправляет обратно на ssh локального компьютера, который отправляет его на 127.0.01: 123 порт.

0
13.02.2019, 14:17
2 ответа

Проблема, которую вы видите, почти наверняка связана с тем, что информация о ходе выполнения печатается с возвратом каретки CR (-, окончанием строки ASCII 13 )вместо традиционной строки Unix LF (-. ] подача, ASCII 10 ). Это делается для того, чтобы каждое новое обновление прогресса печаталось поверх последнего.

К сожалению, это означает, что весь набор обновлений прогресса выглядит для grep, ackи всех других линейно-ориентированных -инструментов как одна строка. Вот почему они, кажется, «запираются» и ничего не печатают, пока ffmpegне завершится, и я не могу придумать аналогичный инструмент выделения, который работал бы на чем-либо, кроме стандартной линейной основы Unix.

Вы могли бы попробовать что-то вроде:

ffmpeg... | tr \\015 \\012 | grep...

, который преобразует все CR в LF. Это позволяетgrepи др. видеть каждое обновление прогресса в виде отдельной строки за счет также просмотра каждого обновления в виде отдельной строки, заполняя ваш терминал:

frame=   85 fps=0.0 q=28.0 size=       0kB time=00:00:03.79 bitrate=   0.1kbits/s dup=1 drop=0 speed=7.55x    
frame=  129 fps=129 q=28.0 size=       0kB time=00:00:05.65 bitrate=   0.1kbits/s dup=1 drop=0 speed=5.64x    
frame=  172 fps=111 q=28.0 size=     256kB time=00:00:07.42 bitrate= 282.6kbits/s dup=1 drop=0 speed=4.81x    
frame=  213 fps=104 q=28.0 size=     512kB time=00:00:09.17 bitrate= 457.3kbits/s dup=1 drop=0 speed=4.49x    
frame=  254 fps= 99 q=28.0 size=     512kB time=00:00:10.85 bitrate= 386.3kbits/s dup=1 drop=0 speed=4.22x    
frame=  295 fps= 96 q=28.0 size=     768kB time=00:00:12.56 bitrate= 500.7kbits/s dup=1 drop=0 speed=4.08x    
frame=  333 fps= 93 q=28.0 size=    1024kB time=00:00:14.14 bitrate= 593.1kbits/s dup=1 drop=0 speed=3.94x    
frame=  382 fps= 93 q=28.0 size=    1024kB time=00:00:16.19 bitrate= 518.1kbits/s dup=1 drop=0 speed=3.93x    
frame=  428 fps= 93 q=28.0 size=    1280kB time=00:00:18.11 bitrate= 579.0kbits/s dup=1 drop=0 speed=3.92x    
frame=  473 fps= 92 q=28.0 size=    1536kB time=00:00:20.00 bitrate= 628.9kbits/s dup=1 drop=0 speed=3.91x    
frame=  519 fps= 92 q=28.0 size=    1536kB time=00:00:21.93 bitrate= 573.8kbits/s dup=1 drop=0 speed= 3.9x    
frame=  567 fps= 92 q=28.0 size=    1792kB time=00:00:23.91 bitrate= 613.9kbits/s dup=1 drop=0 speed=3.89x    
frame=  601 fps= 90 q=28.0 size=    2048kB time=00:00:25.32 bitrate= 662.6kbits/s dup=1 drop=0 speed= 3.8x    
frame=  637 fps= 89 q=28.0 size=    2304kB time=00:00:26.83 bitrate= 703.3kbits/s dup=1 drop=0 speed=3.75x    
frame=  684 fps= 89 q=28.0 size=    2304kB time=00:00:28.77 bitrate= 655.9kbits/s dup=1 drop=0 speed=3.74x    
frame=  720 fps= 84 q=-1.0 size=    2924kB time=00:00:30.01 bitrate= 798.0kbits/s dup=1 drop=0 speed= 3.5x    
...

Вероятно, вы также захотите отключить буферизацию stdio между компонентами в этом конвейере для максимального отклика:

stdbuf -o0 ffmpeg... 2>&1 | stdbuf -i0 -o0 tr \\015 \\012 | stdbuf -i0 -o0 grep...
2
28.01.2020, 02:30
  • Ответ Адриана очень помог, но я потерял диалог, подсказку

    File 'output.mkv' already exists. Overwrite ? [y/N]
    
  • С помощью инструмента vialog, который использует xtermи его файл журнала, я мог заставить его работать полностью

    stdbuf -o0 vialog ffmpeg -t 10 -i input.mp4 output.mkv |
    stdbuf -i0 -o0 tr -s '\015' '\012' |
    stdbuf -i0 -o0 grep --color -e 'time' -e 'speed' -e 'Audio:' -e 'Video:' -e '$'
    
    • с диалогом в окне xterm

    • с высоким -освещением в окне терминала, где vialogзапускается (, что делает его консольным окном xterm),

  • Вы можете найти инструмент vialogпо этой ссылке,

    Разбудить меня, когда [медленный] процесс командной строки требует моего внимания?

    Вы можете изменить vialog, чтобы сделать то, что вам нужно.

0
28.01.2020, 02:30

Теги

Похожие вопросы