[Risolto] Strano funzionamento bash

Salve a tutti

Ho due computer uno che elabora dati (fedora 12) estraendoli da un database mysql secondo alcune informazioni inserite in un file, li comprime e memorizza sia il file normale che il file compresso, ed uno (fedora 8) al quale poi invio i dati (sia normali che compressi) per fare il backup.

Ho generato le chiavi RSA per il collegamento con il computer remoto e trasferisco i dati.

Ho fatto uno script bash per fare questo lavoro, ma ho un problema:

Se il file di informazioni contiene più righe di informazioni da estrarre, se utilizzo il trasferimento tramite ssh, dopo la prima riga letta esce e non completa l’estrazione degli altri dati, mentre invece, se non trasferisco questi dati, completa tutta l’estrazione e la memorizzazione nel computer di lavoro.

Avete qualche idea del perché?

Grazie

Sergio

eh ?

Per favore potresti scrivere in modo più comprensibile cosa vuoi fare e cosa invece non ti riesce di fare ?

Inoltre, fedora 8 è preistoria ormai…

Ok.

Ho dei dati che vengono estratti da un database mysql.
Questi sono indicizzati da un codice (inserito sempre nel database).

Prima di tutto estraggo i codici da questo database e li salvo in un file.

Poi vado a leggere questo file riga per riga ed estraggo questi dati.

Lo script li manipola e crea un file compresso. Alla fine ho due di questi dati, l’originale ed il compresso.

Lo script salva questi dati in cartelle apposite e, per avere una copia, li salva in un altro computer tramite ssh.

Poi va a leggere la seconda riga e ripete il lavoro.

Il problema è che se archivio i dati sul secondo computer, quando rilegge la riga successiva non valorizza la variabile appositamente creata ed esce dal loop
Se invece non invio i dati al secondo computer, va bene. e rilegge le righe successive.

Ho provato a far girare lo script sia senza che con l’invio dei dati, ed ho visto che se do un solo comando ssh, non continua il loop iniziale

questa la parte incriminata:

Ho tre variabili

$USER dove metto gli utenti del secondo computer separati da ","
$HOST dove metto gli host di destinazione sempre separati da ","
$DEST_FOLDER dove inserisco le cartelle degli altri computer sempre separati da ","

arruser=(`echo $USER | tr "," "\n"`) # estrae gli utenti e li inserisce nell'array arruser
arrhost=(`echo $HOST | tr "," "\n"`)# estrae gli host e li inserisce nell'array arrhost
arrdest_folder=(`echo $DEST_FOLDER | tr "," "\n"`) # estrae le cartelle e le inserisce nell'array arrdest_folder

for (( i=0; i<${#arruser@]}; i++))
do
	arr=(`echo "${arrdest_folder$i]}"/sac/$YEAR/$MONTH/$DAY`) # valorizza arr con la cartella di destinazione dell'host seguito da "/sac/anno/mese/giorno"
	ssh "${arruser$i]}"@"${arrhost$i]}" "mkdir -p $arr"  # tramite ssh da il comando di creare la cartella e le sottocartelle se non esistono
done 

Se commento la linea ssh… lo script, alla fine dell’elaborazione della prima riga letta dal file dei codici, lo script legge le righe successive, altrimenti no.

Chiaramente tra i due computer ho generato le chiavi RSA.

Scusami, è uno script bash che fa tutto questo lavoro giusto?
Senza sminuire la potenzialità di bash, per tutte queste operazioni non è forse meglio utilizzare un altro tipo di linguaggio?

Detto questo, non ho capito, il problema salta fuori con l’invio dei dati che non sempre avviene giusto? O è solo li dove hai detto esiste il problema?
Puoi mettere un po’ di controlli per capire cosa avviene? (Fai degli echo alle variabili)…

Veramente il programma fa molto di più…

E uno script che utilizzo per estrarre forme d’onda di terremoti, mandare segnalazione tramite sms o mail, modificare un file xml dove sono contenuti eventi > 2.0 ed altro ancora.

Il problema non è l’invio dei dati ad un altro computer, questo funziona bene.

In pratica il programma estrae un file dal database dove sono scritti i codici degli eventi e li inserisce in un file temporaneo. Fa il confronto con un file vecchio e trova quelli non estratti e li scrive in un altro file temporaneo.

Leggo quindi il secondo file temporaneo (quello degli evento non estratti) riga per riga (1 riga=1 evento) e faccio l’estrazione.

Li converte e li memorizza in un file compresso che poi provvedo a salvare in una cartella di eventi.

Per sicurezza, su un secondo computer voglio salvare questi file.

Ed è qui che si incarta cioè, se inserisco la linea di trasferimento su un altro computer, lui lo trasferisce, ma quando va a leggere la seconda riga del file nuovi, la variabile resta vuota (ho controllato il file ed è giusto) mentre invece se escludo il trasferimento lui prosegue con la seconda riga e rifa il loop (estrazione, conversione e copia in un’altra cartella dello stesso computer)

scusa, proseguo

Ho messo dei controlli inserendo anche il -x ma non sono riuscito a scoprire dove si incarta e perché si incarta. Ho provato a vedere se la variabile venisse utilizzata da un’altra parte, niente. Ho provato a vedere se il file temporaneo degli eventi nuovi veniva manipolato, niente.

Ok, dunque, il tuo script fa anche il “backup” giusto? E questo backup genera il problema al suo funzionamento.
Ma perché non utilizzi rsync per il backup dei file su un altro pc? Anche via ssh?

Perchè rsync deve girare come daemon anche sull’altra macchina e non voglio appesantirla… o mi sbaglio?

Ti sbagli, non è necessario per forza avere un demone rsync per la sincronizzazione/backup…Anzi, se non sbaglio, rsync lanciato come demone su un server viene utilizzato, per lo più, per fare mirroring di file, non tanto per il backup…

OK, lunedi provo ad inserire rsynk e ci farò sapere.
Per il momento grazie.

Però non riesco a capire perché nell’altro modo non funzioni!!!

Forse bash perde il puntatore all’array del ciclo che deve continuare…

Comunque insisto nell’uso di rsync, è davvero ottimo e fa al tuo caso!

Ok, ho fatto lo script con l’uso di rsync e funziona. Ora i file vengono scaricati sull’altro computer e, con l’opzione --delete, crea la seconda cartella come la prima senza tanti controlli da parte del programma (se esiste un file vecchio con un’altra ora cancellalo e copia il nuovo, cancella un file che non era evento ecc.). Indubbiamente semplifica il lavoro, ma non capisco perché perde il puntatore dell’array… Bah, va bene (anzi, va meglio) così.

Grazie tante e a presto.

(MarioS, metti tu [RISOLTO] che non so come si fa? Grazie)

Non so se dire che questa è una limitazione di BASH o un problema nello script. BASH non la vedo utile per fare applicazioni complicate, piuttosto la vedo utile per semplificare, tramite script, le operazioni più ripetitive al suo interno…