Repository 32bit  Forum
Repository 64bit  Wiki

[bash] Barretta di avanzamento progressivo

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[bash] Barretta di avanzamento progressivo

Messaggioda kanzy » mer lug 23, 2008 21:57

ciao a tutti!
Mi piacerebbe creare la classica barretta di avanzamento progressivo per l'output di alcuni semplici script, che prevedono un'attesa per completare le varie operazioni. Tanto per capirci: [============ ] o simile. Ho tentato con `seq', ma, a parte il fatto che non ho moltissima confidenza con la programmazione, non ho idea di come collegare l'avanzamento con il processo in corso. :-k C'è qualche genietto che me lo può spiegare per piacere?.. :D o meglio indicarmi man, howto od esempi?.. Ho consultato i due principali manuali della bash, ma non ho trovato riferimenti al riguardo..
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda submax82 » mer lug 23, 2008 22:05

interesserebbe anche a me ma il problema è stimare quanto manca al processo per terminare o quanto ci mette in totale per calcolare l'avanzamento della barra :-k

c'è questa già fatta

http://www.theiling.de/projects/bar.html

mi ero interessato per aggiungerla in kernelpkg, ma ora non ricordo per quale motivo ma non funzionava come credevo...
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: [bash] Barretta di avanzamento progressivo

Messaggioda _NYTRO_ » mer lug 23, 2008 22:35

Bho, la butto così come m'è venuta in mente ora..

Se si tratta di brevi script di cui, bene o male, conosci il flusso puoi suddividerli in vari segmenti ad ognuno dei quali assegni un "peso"(1, 2 o 3 ecc) e dopo aver eseguito quel pezzo di codice "appendi" in output il numero di '=' o '*' relativo al peso assegnato..
E' moooolto empirica come cosa però, in teoria, dovrebbe funzionare.. Forse con qualche ulteriore dettaglio del job da tracciare è più facile studiare la soluzione..

PS: qualcuno in qualche post della settimana scorsa aveva inserito un pezzettino di script per creare una status-bar per i trasferimenti di file di grandi dimensioni. Se ritrovo il thread te lo linko.. ;)
_NYTRO_
Linux 2.4
Linux 2.4
 
Messaggi: 419
Iscritto il: ven mag 07, 2004 23:00

Re: [bash] Barretta di avanzamento progressivo

Messaggioda _NYTRO_ » mer lug 23, 2008 22:45

_NYTRO_
Linux 2.4
Linux 2.4
 
Messaggi: 419
Iscritto il: ven mag 07, 2004 23:00

Re: [bash] Barretta di avanzamento progressivo

Messaggioda submax82 » mer lug 23, 2008 23:12

nessuno di queste barre può monitorare il pid di un processo perchè penso che non sia possibile farlo almeno non con una progess bar in quanto si dovrebbe fare ogni volta una stima sulla durata del processo
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » gio lug 24, 2008 12:34

@ Nytro

grazie mille per il link! 8) dove ho trovato proprio quello che cercavo!
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » gio lug 24, 2008 18:34

@submax82

in effetti hai ragione.. ho provato lo script, ma va bene solo per copiare grossi files; se però devo effettuare una scansione del disco o un backup sono al punto di partenza.. :?
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » gio lug 24, 2008 21:11

Ragionate un po`:

cpio -V stampa un punto (.) per ogni file copiato,
se dovesse calcolare una directory di 100GB,
quanto tempo in piu` ci impiega?
Poi per calcolare e stampare la percentuale attuale?

Un esempio che lo fa e` e2fsck con reboot cattivo.

UNIX/Linux/Slackware cercano sempre la via piu` corta,
altri quella (graficamente) piu` appariscente,
ad ognuno il suo gusto personale.

PS I codici sorgente cpio/e2fsck sono GPL!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: [bash] Barretta di avanzamento progressivo

Messaggioda bit123 » sab lug 26, 2008 17:02

Implementare una progressbar non è il problema più semplice del programmatore. Ho visto progressbar che prima avanzano spedite e poi si fermano o ritornano indietro per poi ripartire, e sto parlando di software blasonati. Come diceva NITRO, quando c'è una lista iterabile con un ciclo for, basta stampare un carattere 'X' alla fine di ogni ciclo. La situazione diventa più complicata se il processo non è iterabile. Per scrivere un grosso file, ad esempio, lo si potrebbe dividere in piccoli chunck utilizzando un buffer oppure un modo meno corretto ma più semplice potrebbe essere quello di eseguire un processo parallelo che vada a leggere il file temporaneo ogni tot msec.
Bisognerebbe vedere cosa fa il tuo programma. Saluti!
bit123
Linux 2.4
Linux 2.4
 
Messaggi: 350
Iscritto il: dom nov 27, 2005 16:26
Località: Catania

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » sab lug 26, 2008 22:09

@bit123
grazie per la risposta, che mi fa comprendere il problema nello specifico. #-o
i miei due scriptini servono 1) ad effettuare la scansione del disco del server web con clamav; 2) ad effettuare il backup del volume dei dati. funzionalmente - ovviamente - non ho bisogno di nessuna barra di avanzamento, ma - come ho scritto nel post - 'mi piacerebbe'.. non avendo una conoscenza molto approfondita dello scripting, pensavo si potesse risolvere in modo generico (le barre di avanzamento pullulano ovunque, sin dagli albori di linux). purtroppo quando le cose non si sanno, si trattano con superficialità.. ma i forum servono a questo :D . grazie.
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda submax82 » dom lug 27, 2008 9:08

Come diceva NITRO, quando c'è una lista iterabile con un ciclo for, basta stampare un carattere 'X' alla fine di ogni ciclo.


non è così semplice perchè in questo modo la lunghezza della barra è variabile non essendo divisa in modo proporzionale alla durata del processo che viene monitorato

la cosa più semplice è non fare una barra ma una breve stringa di attesa tipo "..." che stampa uno, due, tre puntini e poi riparte o la barretta che ruota... non a caso in kernelpkg ho adottato questa soluzione.
Avatar utente
submax82
Staff
Staff
 
Messaggi: 3202
Iscritto il: mar ago 30, 2005 23:00
Desktop: xfce
Distribuzione: SalixOS

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Blizzard » dom lug 27, 2008 10:30

ciao,
visto come un esercizio di programmazione è senz'altro ottimo.
Riguardo il suo utilizzo pratico sono dello stesso avviso di Mario. Le operazioni di output su schermo sono effettivamente pesanti, soprattutto se ripetute spesso oltre al fatto che il codice che deve calcolare i dati deve andare a pescarli dall'esecuzione di un altro processo.
Ponendo ad esempio il caso della copia di un grande file, il tutto è veloce proprio grazie al memory mapping che consente riduzioni delle operazioni di I/O su disco mappando il file in ram. Così facendo andreste ad aggiungere operazioni di I/O a video che IMHO pesano comunque.

a cosa più semplice è non fare una barra ma una breve stringa di attesa tipo "..." che stampa uno, due, tre puntini e poi riparte o la barretta che ruota... non a caso in kernelpkg ho adottato questa soluzione.

Tra le altre cose questa mi sembra un'ottima soluzione, anche se effettivamente non mostra l'attuale avanzamento dell'operazione ma solo la sua progressione.

ciao
Gio
Avatar utente
Blizzard
Master
Master
 
Messaggi: 1509
Iscritto il: mar gen 02, 2007 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox

Re: [bash] Barretta di avanzamento progressivo

Messaggioda kanzy » dom lug 27, 2008 11:16

submax82 ha scritto:ma una breve stringa di attesa tipo "..." che stampa uno, due, tre puntini e poi riparte o la barretta che ruota...


..e come si fa?.. :D
l'uomo ha bisogno di cibo rifugio e storie
Avatar utente
kanzy
Linux 2.4
Linux 2.4
 
Messaggi: 206
Iscritto il: sab mag 10, 2008 14:02
Località: Godiasco PV
Nome Cognome: Franz Fricker
Slackware: 14.0-x86_64
Kernel: 3.2.29
Desktop: kde

Re: [bash] Barretta di avanzamento progressivo

Messaggioda sir_alex » mer lug 30, 2008 10:30

Blizzard ha scritto:ciao,
visto come un esercizio di programmazione è senz'altro ottimo.
Riguardo il suo utilizzo pratico sono dello stesso avviso di Mario. Le operazioni di output su schermo sono effettivamente pesanti, soprattutto se ripetute spesso oltre al fatto che il codice che deve calcolare i dati deve andare a pescarli dall'esecuzione di un altro processo.
Ponendo ad esempio il caso della copia di un grande file, il tutto è veloce proprio grazie al memory mapping che consente riduzioni delle operazioni di I/O su disco mappando il file in ram. Così facendo andreste ad aggiungere operazioni di I/O a video che IMHO pesano comunque.

Bè, a parte la rara eventualità di copiare in un colpo solo 100 gb (salvo per un ripristino di sistema), sicuramente ci sarà meno overhead di una barra di progressione GUI (stile KDE o Gnome, per intenderci), tra l'altro anche l'overhead di queste ultime non è così incisivo... certo, se cercate le prestazioni ad ogni costo... :)
sir_alex
Linux 2.6
Linux 2.6
 
Messaggi: 735
Iscritto il: lun mar 21, 2005 0:00
Località: Milano - Corbola (RO)
Kernel: 2.6.35-22
Desktop: KDE4
Distribuzione: Ubuntu

Re: [bash] Barretta di avanzamento progressivo

Messaggioda Mario Vanoni » mer lug 30, 2008 15:38

sir_alex ha scritto:Bè, a parte la rara eventualità di copiare in un colpo solo 100 gb (salvo per un ripristino di sistema), sicuramente ci sarà meno overhead di una barra di progressione GUI (stile KDE o Gnome, per intenderci), tra l'altro anche l'overhead di queste ultime non è così incisivo... certo, se cercate le prestazioni ad ogni costo... :)


Giudica la mia situazione,
main machine: 2 HD di 1TB, pieni di dati al 55% ed al 65%
backup machine idem, identica,
nastri di quelle dimensioni per backup sono impagabili.

Faccio un aggiornamento ogni 30 minuti con ssync(1) licenza GPL,
ed ho il suo file protocollo in /var/log/ssync/ssyncDD (giornaliero).
Usando il log-level meno ciarliero, impiega 2 minuti,
se non ci sono cambiamenti maggiori, altrimenti fino a venti minuti.

Visto che il codice sorgente (in C) e` disponibile,
fare una barretta di avanzamento non e` un problema,
fprintf(stderr ... per file 1 "-", file 2 "\", file 3 "|", file 4 "/" ecc. ecc.

Ma quanto tempo impiega poi il tty a portarlo sullo schermo?
In modo GUI probabilmente ancora di piu`!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti