DigitalKiller
08-06-2009, 22:43
Ciao a tutti. Ho scritto uno script bash per ricevere dei dati dalla porta seriale e trasferirli automaticamente su un server ftp.
#!/bin/bash
USER=utente # Utente
COM=/dev/ttyS0 # Porta COM su cui restare in ascolto
RX='/usr/bin/rx -caX' # Comando per la ricezione del file
SHAREDIR=/home/utente/Download # Directory di condivisione del file
BACKUPDIR=/home/utente/Download/backup # Directory di backup del file ricevuto
TMPDIR=/tmp # Directory temporanea
FILE=FIle.dat # File ricevuto
TIME=`date +%d%m%y%H%M%S` # Timestamp del file ricevuto
if [ -s $TMPDIR/$FILE ]
then
IFS_BAK=$IFS
IFS='\n'
for r in $(cat $TMPDIR/$FILE)
do
len=`echo $r | wc -c | tr -d ' '`
if [ $len -lt '36' ]
then
IFS=$IFS_BAK
su $USER -c "export DISPLAY=:0.0; zenity --error --text='Si è verificato un errore nella ricezione del file. Ripetere la trasmissione'"
exit 1
fi
done
IFS=$IFS_BAK
mv $TMPDIR/$FILE $TMPDIR/File_$TIME
RECORD=`cat $TMPDIR/File_$TIME | wc -l`
su $USER -c "export DISPLAY=:0.0; zenity --question --text='Il file ricevuto contiene $RECORD articoli. Proseguire?'"
if [ "$?" -eq 0 ]
then
FILIALE=`sed -n '1p' $TMPDIR/File_$TIME | cut -c 6-11`
FLAG=`sed -n '1p' $TMPDIR/File_$TIME | cut -c 13`
mv $TMPDIR/File_$TIME $TMPDIR/$FLAG$FILIALE$TIME.pdt
cd $TMPDIR
echo "$ ServerFtp" | ftp -i xx.xx.xx.xx
rm -f $TMPDIR/$FLAG$FILIALE$TIME.pdt
su $USER -c "export DISPLAY=:0.0; zenity --info --text='Elaborazione terminata correttamente!'"
else
mv $TMPDIR/File_$TIME $BACKUPDIR/
su $USER -c "export DISPLAY=:0.0; zenity --error --text='Elaborazione interrotta!'"
fi
fi
$RX $TMPDIR/$FILE < $COM > $COM
exit 0
Lo script, avviato automaticamente tramite inittab, resta in ascolto sulla porta ttyS0 e, ricevuti i dati, termina per poi essere subito rieseguito (in inittab ho impostato il flag respawn per il processo).
Non appena il processo viene rilanciato, il file contentente i dati scaricati dovrebbe essere inviato al server ftp. Questo, però, non avviene.
Lo script torna in ascolto sulla seriale, ma sul server non viene caricato niente.
Eseguendo lo script manualmente, invece, funziona correttamente.:muro:
Quale potrebbe essere il problema? Avete dei suggerimenti?
Grazie a tutti
#!/bin/bash
USER=utente # Utente
COM=/dev/ttyS0 # Porta COM su cui restare in ascolto
RX='/usr/bin/rx -caX' # Comando per la ricezione del file
SHAREDIR=/home/utente/Download # Directory di condivisione del file
BACKUPDIR=/home/utente/Download/backup # Directory di backup del file ricevuto
TMPDIR=/tmp # Directory temporanea
FILE=FIle.dat # File ricevuto
TIME=`date +%d%m%y%H%M%S` # Timestamp del file ricevuto
if [ -s $TMPDIR/$FILE ]
then
IFS_BAK=$IFS
IFS='\n'
for r in $(cat $TMPDIR/$FILE)
do
len=`echo $r | wc -c | tr -d ' '`
if [ $len -lt '36' ]
then
IFS=$IFS_BAK
su $USER -c "export DISPLAY=:0.0; zenity --error --text='Si è verificato un errore nella ricezione del file. Ripetere la trasmissione'"
exit 1
fi
done
IFS=$IFS_BAK
mv $TMPDIR/$FILE $TMPDIR/File_$TIME
RECORD=`cat $TMPDIR/File_$TIME | wc -l`
su $USER -c "export DISPLAY=:0.0; zenity --question --text='Il file ricevuto contiene $RECORD articoli. Proseguire?'"
if [ "$?" -eq 0 ]
then
FILIALE=`sed -n '1p' $TMPDIR/File_$TIME | cut -c 6-11`
FLAG=`sed -n '1p' $TMPDIR/File_$TIME | cut -c 13`
mv $TMPDIR/File_$TIME $TMPDIR/$FLAG$FILIALE$TIME.pdt
cd $TMPDIR
echo "$ ServerFtp" | ftp -i xx.xx.xx.xx
rm -f $TMPDIR/$FLAG$FILIALE$TIME.pdt
su $USER -c "export DISPLAY=:0.0; zenity --info --text='Elaborazione terminata correttamente!'"
else
mv $TMPDIR/File_$TIME $BACKUPDIR/
su $USER -c "export DISPLAY=:0.0; zenity --error --text='Elaborazione interrotta!'"
fi
fi
$RX $TMPDIR/$FILE < $COM > $COM
exit 0
Lo script, avviato automaticamente tramite inittab, resta in ascolto sulla porta ttyS0 e, ricevuti i dati, termina per poi essere subito rieseguito (in inittab ho impostato il flag respawn per il processo).
Non appena il processo viene rilanciato, il file contentente i dati scaricati dovrebbe essere inviato al server ftp. Questo, però, non avviene.
Lo script torna in ascolto sulla seriale, ma sul server non viene caricato niente.
Eseguendo lo script manualmente, invece, funziona correttamente.:muro:
Quale potrebbe essere il problema? Avete dei suggerimenti?
Grazie a tutti