LINUX.ORG.RU

Прогресс-бар zenity убивает процесс в пайпе при auto-close

 ,


0

2

Есть пайп, где используется прогресс-бар zenity и pv как счетчик строк:

(какой-то скрипт 2>&1 | pv -nls $MAXLINES >/dev/null) 2>&1 | zenity --progress --auto-close

Если $MAXLINES задан неверно (меньше, чем реально генерирует скрипт), то по достижении 100% zenity закрывается и прибивает пайп. Можно ли сделать так, чтобы процесс продолжал работать до победного конца даже после закрытия окна zenity?



Последнее исправление: Ankor (всего исправлений: 1)

Если ты не знаешь, какой вывод будет, то зачем указываешь размер? pv конечно не помрёт, но 1000% бессмысленны.

В zenity можно бегунок сделать. И субшелл не нужен:

$ скрипт | zenity --progress --pulsate --auto-close

ziemin ★★
()

Завершение процессов в пайпе при его закрытии - это особенность пайпов, а не zenity. Эта особенность пайпов применяется, когда последующей команде нужно только первые несколько строк выхлопа предыдущей команды.

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

Указываю, когда знаю размер, но ошибки случаются, и мне не хотелось бы, чтобы скрипт так завершался, если не сможет посчитать размер.

--pulsate хорош, когда процесс 10 сек занимает, а при большой длительности невозможность прикинуть, сколько осталось, нервирует.

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

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

Если ты не знаешь, сколько строк, разбивай на этапы и выводи для каждого окошко. Будет какое-то изменение.

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

Завершение процессов в пайпе при его закрытии - это особенность пайпов, а не zenity. Эта особенность пайпов применяется, когда последующей команде нужно только первые несколько строк выхлопа предыдущей команды.

Дело в том, что zenity в разных случаях ведёт себя по-разному. Наверное, он умеет закрывать окно и ждать, пока закончится процесс в трубе.

Пример:

(echo 50; sleep 1; echo 100; echo 90; sleep 10) | zenity --progress --auto-close
окно закрывается, только открывшись, но команда послушно выполняется 10 секунд;

(echo 50; sleep 1; echo 100; sleep 1; echo 90; sleep 10) | zenity --progress --auto-close

процесс умирает через секунду после закрытия окна;

(echo 50; sleep 1; echo 100; sleep 0.1; echo 90; sleep 10) | zenity --progress --auto-close

раз на раз не приходится, то сразу убивает процесс, то ждет все 10 сек.

Почему от скорости скармливания zenity аргументов зависит его поведение? Это баг или фича?

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

... | ( zenity --progress --auto-close; cat >/dev/null; )

cat: -: Ресурс временно недоступен

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

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

(echo 50; sleep 1; echo 100; sleep 1; stdbuf -oL echo 90; sleep 10) | zenity --progress --auto-close

gorky ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.