Newsgroup: it.comp.os.linux.sys
Titolo: Aiuto con script bash

Ciao, sto facendo un piccolo script bash che mi avvisi
se si pianta l'rsync verso un altro server,
ma vorrei passare la stringa di comando come parametro:
Il mio problema è che nella stringa passata come parametro ci sono apici:
./test.bash 'rsync -apv -e "/usr/bin/ssh -p2222" /root/ 
ro...@00.00.00.00:/home/test/'
e quindi mi da l'errore:
No such file or directory
se tolgo gli apici dal
if `"$1"`
non mi prende il comando completo ..
-------------------------
#!/bin/bash
DATE=`date +%m/%d/%Y-%H:%M:%S`
MSG="Errore rsync da MIOSERVER IP"
LOGFILE="/var/log/rsync_su_nodo2_error.log"
if [ "$1" = '' ];
then
	echo "ERRORE! Nessun Argomneto passato allo scritp"
	echo -e "ERRORE! Nessun Argomneto passato allo scritp"  | mail -s 
"Nessun Argomneto passato allo scritp" miamail
	exit
fi
echo $1
if `"$1"`
then
     echo "Rsync su mioserver Completato"
     if grep "$MSG" /etc/motd > /dev/null
     then	
	sed -i s/"$DATE - $MSG"//g /etc/motd
     fi
else
     ## Inserisco l'allarme solo la prima volta
     if grep "$MSG" /etc/motd > /dev/null
     then
             echo "messaggio già resente in motd"
     else
             echo "" >> /etc/motd
             echo "$DATE - $MSG" >> /etc/motd
     fi
	ERRORE=`cat $LOGFILE`
     echo -e "$MSG\n$ERRORE"
     echo -e "$MSG\n$ERRORE"  | mail -s "$MSG" miamail
fi
---------------------------------------------
GRAZIE!
-- Yena --

 r...@00.00.00.00:/home/test/'

Forse basta " -> \"
Comunque in generale non ti consiglio di farti uno script per quello,
usa monit
http://mmonit.com/
o qualcosa di simile e vivi felice ;)

 if `"$1"`; then
Penso che l'errore sia nella lettura deli argomenti passati allo 
script e nell'uso che fai degli apici.  Non so se sia un problema di 
charset attraverso la rete ma io vedo gli apici sbagliati (`) anziché 
(') nell'ultima istruzione che riporto.  Se, come sembra dallo script, 
vuoi testare il codice ritornato dal comando non devi mettere nessun 
apice.  Usando gli apici `...` ti viene ritornato quello che il comdo 
spara sullo stdout.
In ogni caso se vuoi evitare di mettere gli apici sulla linea di 
comando dovrebbe essere sufficiente modificare:
 > echo $1
 > if `"$1"`	
in
echo $@
if $@ ; then
Il primo test
 > if [ "$1" = '' ]; then
può rimanere come è se ti basta testare che vi siano argomenti ma 
potrebbe diventare, se vuoi essere paranoico
if [ ! "$1" = "rsync" -o $# -lt X ]; then
dove X è il numero minimo di argomenti da passare alo script
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 ...
A parte che usare insieme gli apici ed i doppi apici è una stupidaggine 
colossale impara come si fa a trattare i processi figli ed usa il 
parametro $? per conoscerne lo stato di uscita. 
Plonk!

 o qualcosa di simile e vivi felice ;)
L'rsync viene lanciato da cron .. monit serve per monitorare dei servizi 
... forse non ho capito cosa intendi ..
-- Yena --

 Giovanni
So che ï¿œ bruttino .. ma cosï¿œ funziona:
if eval $1
...
-- Yena --

>> ma vorrei passare la stringa di comando come parametro:
avevo dato per scontato che ci fosse un demone, altrimenti cosa vuoi
verificare che si pianti?
Se tu avessi rsyncd in ascolto su quel server e controllassi quello con
monit non sarebbe tutto più semplice forse?

 ...
Non è brutto ma è esattamente equivalente a quello che ti avevo 
suggerito.  Inoltre in questo modo sei costretto a mettere gli apici 
sulla riga di comando.  Usando invece:
if $@ ; then		##  oppure
if eval $@ ; then	##  puoi dare il comando
./test.bash rsync -apv -e "/usr/bin/ssh -p2222" \
	/root/ ro...@00.00.00.00:/home/test/
Solo "/usr/bin/ssh -p2222" deve rimanere fra "..." perché rappresenta 
l'argomento (unico) per l'opzione -e


 Giovanni
aaa OK chiaro :-)
Grazie mille !!
-- Yena --


Ho diversi rsync che partono da /etc/crontab e usano ssh, niente server 
rsync.
Voglio verificare che la connessione venga aperta e rsync non dia errori.
Nel caso li dia voglio essere informato via mail e piazzo anche un 
messaggio in motd
Grazie!
-- Yena --

 if eval $1
IMHO non ï¿œ una soluzione nï¿œ elegante nï¿œ molto corretta.
Una cosa IMHO piï¿œ pulita  puï¿œ essere quella di invocare lo script senza
apici tra gli argomenti, cosï¿œ:
./test.sh rsync -apv -e "/usr/bin/ssh -p2222" /SRC ro...@127.0.0.1:/DST
E nello script mettere questo:
#!/bin/bash
...
EXE="$1"
shift
$EXE "$@"
if ...
-- 
Flavio Visentin
Scientists have finally discovered what's wrong with the female brain:
On the left side, there is nothing right, and on the right side, there
is nothing left.

 if ...
troppo complicato: basta:
#! /bin/bash
...
"$@"
if  ...

 fi
L'output di rsync sono i nomi dei file copiati; non è una buona idea 
eseguirli nè è una buona idea metre (potenzialmente) migliaia nomi 
di file in una variabile.
credo che tu avresti dovuto scrivere:
if "$@" 
  then 
    echo OK
  else
    echo "KO :("
  fi
Inoltre tutto questo mi pare abbastanza stupido poiché questo script
è destinato ad essere eseguito da cron che già manda l'output dello 
script tramite mail; al limite redirigi anche i messaggi di errore ed 
abiliti mail.

 troppo complicato: basta:
E' verissimo che basta il "$@", ma io preferisco sempre fare il
passaggio di separazione dell'eseguibile perchï¿œ mi sembra piï¿œ chiaro ed
elegante.



Con redirezione output intendevo solo gli errori naturalmente 2>
-- Yena --


YESSS :-)
THANKS!
-- Yena --