[bash] Barretta di avanzamento progressivo
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.
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
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. C'è qualche genietto che me lo può spiegare per piacere?.. o meglio indicarmi man, howto od esempi?.. Ho consultato i due principali manuali della bash, ma non ho trovato riferimenti al riguardo..
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. C'è qualche genietto che me lo può spiegare per piacere?.. 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
- submax82
- Staff
- Messaggi: 3202
- Iscritto il: mer 31 ago 2005, 0:00
- Desktop: xfce
- Distribuzione: SalixOS
- Contatta:
Re: [bash] Barretta di avanzamento progressivo
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
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...
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...
Re: [bash] Barretta di avanzamento progressivo
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..
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..
- submax82
- Staff
- Messaggi: 3202
- Iscritto il: mer 31 ago 2005, 0:00
- Desktop: xfce
- Distribuzione: SalixOS
- Contatta:
Re: [bash] Barretta di avanzamento progressivo
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
Re: [bash] Barretta di avanzamento progressivo
@ Nytro
grazie mille per il link! dove ho trovato proprio quello che cercavo!
grazie mille per il link! dove ho trovato proprio quello che cercavo!
l'uomo ha bisogno di cibo rifugio e storie
Re: [bash] Barretta di avanzamento progressivo
@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..
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
-
- Iper Master
- Messaggi: 3174
- Iscritto il: lun 3 set 2007, 21:20
- Nome Cognome: Mario Vanoni
- Slackware: 12.2
- Kernel: 3.0.4 statico
- Desktop: fluxbox/seamonkey
- Località: Cuasso al Monte (VA)
Re: [bash] Barretta di avanzamento progressivo
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!
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!
Re: [bash] Barretta di avanzamento progressivo
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!
Bisognerebbe vedere cosa fa il tuo programma. Saluti!
Re: [bash] Barretta di avanzamento progressivo
@bit123
grazie per la risposta, che mi fa comprendere il problema nello specifico.
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 . grazie.
grazie per la risposta, che mi fa comprendere il problema nello specifico.
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 . grazie.
l'uomo ha bisogno di cibo rifugio e storie
- submax82
- Staff
- Messaggi: 3202
- Iscritto il: mer 31 ago 2005, 0:00
- Desktop: xfce
- Distribuzione: SalixOS
- Contatta:
Re: [bash] Barretta di avanzamento progressivo
non è così semplice perchè in questo modo la lunghezza della barra è variabile non essendo divisa in modo proporzionale alla durata del processo che viene monitoratoCome diceva NITRO, quando c'è una lista iterabile con un ciclo for, basta stampare un carattere 'X' alla fine di ogni ciclo.
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.
- Blizzard
- Master
- Messaggi: 1509
- Iscritto il: mar 2 gen 2007, 22:53
- Nome Cognome: Giovanni Santostefano
- Slackware: 12.2
- Kernel: 2.6.27.7-smp
- Desktop: Fluxbox
- Contatta:
Re: [bash] Barretta di avanzamento progressivo
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.
ciao
Gio
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.
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.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.
ciao
Gio
Re: [bash] Barretta di avanzamento progressivo
..e come si fa?..submax82 ha scritto:ma una breve stringa di attesa tipo "..." che stampa uno, due, tre puntini e poi riparte o la barretta che ruota...
l'uomo ha bisogno di cibo rifugio e storie
-
- Linux 3.x
- Messaggi: 735
- Iscritto il: lun 21 mar 2005, 0:00
- Kernel: 2.6.35-22
- Desktop: KDE4
- Distribuzione: Ubuntu
- Località: Milano - Corbola (RO)
- Contatta:
Re: [bash] Barretta di avanzamento progressivo
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...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.
-
- Iper Master
- Messaggi: 3174
- Iscritto il: lun 3 set 2007, 21:20
- Nome Cognome: Mario Vanoni
- Slackware: 12.2
- Kernel: 3.0.4 statico
- Desktop: fluxbox/seamonkey
- Località: Cuasso al Monte (VA)
Re: [bash] Barretta di avanzamento progressivo
Giudica la mia situazione,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...
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`!