Вышеупомянутые примечания верны, но имейте в виду, что пользователь может заставить свой браузер не отправлять эту информацию, или они могут связываться с этой информацией и отправлять ложные данные.
Я предпочитаю использовать диалог с параметром - 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"
Я основывался на ответе, предоставленном страхом
. Он соединяется с базой данных 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'
Сначала запустите процесс в фоновом режиме, затем часто наблюдайте за его текущим состоянием, который выполнялся, распечатайте шаблон и еще раз проверьте, выполнялось ли это состояние или нет;
Использование цикла 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 указанного процесса
Чтобы создать индикатор выполнения tar
tar xzvf pippo.tgz |xargs -L 19 |xargs -I@ echo -n "."
Где «19» - это количество файлов в tar, разделенное на длину предполагаемого индикатора выполнения. Пример: .tgz содержит 140 файлов, и вам понадобится индикатор выполнения 76 ".", Вы можете поставить -L 2.
Вам больше ничего не нужно.
Получил простую функцию индикатора выполнения, которую я написал на днях:
#!/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 /
#!/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 "до предполагаемого размера выходного файла)