Как добавить индикатор выполнения в сценарий оболочки?

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

368
задан Jens 30 May 2012 в 10:56
поделиться

36 ответов

Я предпочитаю использовать диалог с параметром - gauge . Очень часто используется в установочных пакетах .deb и других элементах базовой конфигурации многих дистрибутивов. Так что вам не нужно изобретать велосипед ... снова

Просто установите значение int от 1 до 100 @stdin. Один простой и глупый пример:

for a in {1..100}; do sleep .1s; echo $a| dialog --gauge "waiting" 7 30; done

У меня есть этот файл / bin / Wait (с chmod u + x perms) для целей приготовления: P

#!/bin/bash
INIT=`/bin/date +%s`
NOW=$INIT
FUTURE=`/bin/date -d "$1" +%s`
[ $FUTURE -a $FUTURE -eq $FUTURE ] || exit
DIFF=`echo "$FUTURE - $INIT"|bc -l`

while [ $INIT -le $FUTURE -a $NOW -lt $FUTURE ]; do
    NOW=`/bin/date +%s`
    STEP=`echo "$NOW - $INIT"|bc -l`
    SLEFT=`echo "$FUTURE - $NOW"|bc -l`
    MLEFT=`echo "scale=2;$SLEFT/60"|bc -l`
    TEXT="$SLEFT seconds left ($MLEFT minutes)";
    TITLE="Waiting $1: $2"
    sleep 1s
    PTG=`echo "scale=0;$STEP * 100 / $DIFF"|bc -l`
    echo $PTG| dialog --title "$TITLE" --gauge "$TEXT" 7 72
done

if [ "$2" == "" ]; then msg="Espera terminada: $1";audio="Listo";
else msg=$2;audio=$2;fi 

/usr/bin/notify-send --icon=stock_appointment-reminder-excl "$msg"
espeak -v spanish "$audio"

Так что я могу поставить:

Wait "34 min" "warm up the oven"

или

Wait "dec 31" "happy new year"

3
ответ дан Juan Eduardo Castaño Nestares 30 May 2012 в 10:56
поделиться

Я основывался на ответе, предоставленном страхом

. Он соединяется с базой данных Oracle для получения информации о ходе восстановления RMAN.

#!/bin/bash

 # 1. Create ProgressBar function
 # 1.1 Input is currentState($1) and totalState($2)
 function ProgressBar {
 # Process data
let _progress=(${1}*100/${2}*100)/100
let _done=(${_progress}*4)/10
let _left=40-

Я основывался на ответе, предоставленном страхом

. Он соединяется с базой данных Oracle для получения информации о ходе восстановления RMAN.

[110]done # Build progressbar string lengths _fill=$(printf "%${_done}s") _empty=$(printf "%${_left}s") # 1.2 Build progressbar strings and print the ProgressBar line # 1.2.1 Output example: # 1.2.1.1 Progress : [########################################] 100% printf "\rProgress : [${_fill// /#}${_empty// /-}] ${_progress}%%" } function rman_check { sqlplus -s / as sysdba <<EOF set heading off set feedback off select round((sofar/totalwork) * 100,0) pct_done from v\$session_longops where totalwork > sofar AND opname NOT LIKE '%aggregate%' AND opname like 'RMAN%'; exit EOF } # Variables _start=1 # This accounts as the "totalState" variable for the ProgressBar function _end=100 _rman_progress=$(rman_check) #echo ${_rman_progress} # Proof of concept #for number in $(seq ${_start} ${_end}) while [ ${_rman_progress} -lt 100 ] do for number in _rman_progress do sleep 10 ProgressBar ${number} ${_end} done _rman_progress=$(rman_check) done printf '\nFinished!\n'
0
ответ дан CH55 30 May 2012 в 10:56
поделиться

Сначала запустите процесс в фоновом режиме, затем часто наблюдайте за его текущим состоянием, который выполнялся, распечатайте шаблон и еще раз проверьте, выполнялось ли это состояние или нет;

Использование цикла while для просмотра состояния процесса часто.

используйте pgrep или любую другую команду для просмотра и получения статуса выполнения процесса.

при использовании pgrep перенаправьте ненужный вывод в / dev / null по мере необходимости.

Код:

sleep 12&
while pgrep sleep &> /dev/null;do echo -en "#";sleep 0.5;done

Этот «#» будет печататься до тех пор, пока не прекратится спящий режим, этот метод используется для реализации индикатора выполнения для времени выполнения программы.

Вы также можете использовать этот метод для команд для обработки сценариев, чтобы проанализировать его время обработки как визуальное.

BUG: этот метод pgrep работает не во всех ситуациях, неожиданно другой процесс выполнялся с тем же именем, а цикл while не заканчивается.

, чтобы получить статус выполнения процесса, указав его PID, используя, возможно, процесс, который может быть доступен с некоторыми командами,

команда пс перечислит все процесс с идентификатором, вам нужно grep , чтобы узнать pid указанного процесса

-1
ответ дан purushothaman poovai 30 May 2012 в 10:56
поделиться

Чтобы создать индикатор выполнения tar

tar xzvf pippo.tgz |xargs -L 19 |xargs -I@ echo -n "."

Где «19» - это количество файлов в tar, разделенное на длину предполагаемого индикатора выполнения. Пример: .tgz содержит 140 файлов, и вам понадобится индикатор выполнения 76 ".", Вы можете поставить -L 2.

Вам больше ничего не нужно.

-2
ответ дан DeathFromAbove 30 May 2012 в 10:56
поделиться

Получил простую функцию индикатора выполнения, которую я написал на днях:

#!/bin/bash
# 1. Create ProgressBar function
# 1.1 Input is currentState($1) and totalState($2)
function ProgressBar {
# Process data
    let _progress=(${1}*100/${2}*100)/100
    let _done=(${_progress}*4)/10
    let _left=40-

Получил простую функцию индикатора выполнения, которую я написал на днях:

[110]

Или поймал ее,
https://github.com/fearside/ProgressBar /

done # Build progressbar string lengths _fill=$(printf "%${_done}s") _empty=$(printf "%${_left}s") # 1.2 Build progressbar strings and print the ProgressBar line # 1.2.1 Output example: # 1.2.1.1 Progress : [########################################] 100% printf "\rProgress : [${_fill// /\#}${_empty// /-}] ${_progress}%%" } # Variables _start=1 # This accounts as the "totalState" variable for the ProgressBar function _end=100 # Proof of concept for number in $(seq ${_start} ${_end}) do sleep 0.1 ProgressBar ${number} ${_end} done printf '\nFinished!\n'

Или поймал ее,
https://github.com/fearside/ProgressBar /

36
ответ дан Goron 30 May 2012 в 10:56
поделиться
#!/bin/bash
tot=$(wc -c /proc/$/fd/255 | awk '/ /{print $1}')
now() {
echo $(( 100* ($(awk '/^pos:/{print $2}' < /proc/$/fdinfo/255)-166) / (tot-166) )) "%"
}
now;
now;
now;
now;
now;
now;
now;
now;
now;

вывод:

0 %
12 %
25 %
37 %
50 %
62 %
75 %
87 %
100 %

примечание: если вместо 255 вы введете 1, вы будете контролировать стандарт на ... с 2 на выходе стандарта (но вы должны изменить источник для установки " tot "до предполагаемого размера выходного файла)

0
ответ дан Zibri 30 May 2012 в 10:56
поделиться