LINUX.ORG.RU

Несколько pv в pipe иногда ломают консоль

 , ,


0

1

Есть комманда внутри скрипта

set -e -o pipefail
...
tar -cf - ./ | pv -cN "RAW" -s $RAW_size | zstd | pv -cN "Compressed" > "${BUILD_RESULT}/rootfs.tar.zstd"

Которая раз через раз «ломает консоль». Проявляется это тем, что все вводимые символы не отображаются, но вводятся.

Если в результате работы комманды выхлоп выглядит так

Compressed: 1,56GiB 0:01:20 [19,9MiB/s] [                                                               <=>                                                                                                         ]
      RAW: 4,16GiB 0:01:20 [53,0MiB/s] [==========================================================================================================================================================>] 100%            

То, всё хорошо, а если

Compressed: 13,7MiB 0:00:01 [13,7MiB/s] [   <=>                                                                                                                                                                     ]
      RAW: 4,16GiB 0:01:15 [56,4MiB/s] [==========================================================================================================================================================>] 100%            
Compressed: 1,56GiB 0:01:15 [21,1MiB/s] [                                                                                    <=>                                                                                    ]

Значит «сломалось»

Локализую сейчас перезапуском ssh сессии до узла или перезапуском mc.

Ищу идей куда посмотреть/что выполнить чтобы починить консоль без перезапуска mc/ssh сессии

★★

Кажется нашёл решение

stty -a

В «сломанной» консоли
isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase tostop -echoprt echoctl echoke -flusho -extproc
В «работающей»
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

Собственно я добавил в скрипт после проблемной комманды

stty isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

Это локализация, меня устроит, но хотелось бы понять/починить первопричину.

Flotsky ★★
() автор топика
Ответ на: комментарий от Flotsky

Это локализация, меня устроит, но хотелось бы понять/починить первопричину.

Я думаю, что это как-то то так происходит: программы, меняющие режим работы терминала, обычно запоминают предыдущее его состояние (все эти флаги, которые ты смотришь по stty -a), после чего меняют флаги на нужное им состояние.

Если запускается только один pv, то он всегда считает то состояние, в котором работал shell, после чего «перестраивает» терминал под свои нужды, а по окончанию работы возвращает все в состояние, приемлемое для shell-а.

Если же запускается два и более экземпляра pv, то возможен race condition, когда один из них запомнит состояние терминала таким, каким его установил другой pv. Ну а затем после завершения, вернет флаги в «неправильное» состояние.

kawaii_neko ★★★★
()
Ответ на: комментарий от u5er

Вопрос в том, сколько ещё использует pv подобным образом, чтобы обнаружить багу. Когда я смотрел исходники pv, там особо не маялись качеством кода, например не проверяли результат tcsetattr().

Ну, плюс, наверное у ТС не линукс консоль, а какой-то эмулятор терминала, которых сейчас немеряно разных, там тоже могут быть баги.

mky ★★★★★
()