Sistema de origem:
- CentOS 7
- bash shell
- fecho eclair
Sistema de destino:
- servidor FTP
- CentOS 6.4
- bash shell
- descompactar
Eu escrevi um script para arquivar o arquivo e enviá-lo para o servidor FTP usando shell script
#!/bin/bash
# Declare no. of days
days=15
# Declare Source path of sql files and Destination path of backup directory
dumps=/home/applications/backup
bkpdir=/home/applications/backup/olddumps
# Find sql dumps of ets
files=($(find $dumps/*.sql -mtime +"$days"))
for file in ${files[*]}
do
# Move each file into backup dir which is 15 days old
echo "file is: $file\n";
mv $file $bkpdir
# Find the sql files and compress them
cd $bkpdir
filename=$(basename $file)
zip $bkpdir/$filename.zip $filename
# FTP Login
HOST=a.b.c.d
USER=xxxx
PASS=yyyyy
REM_DIR=/olddumps/sqlfiles
echo "Uploading file via FTP:"
ftp -in $HOST <<EOF
quote USER $USER
quote PASS $PASS
cd $REM_DIR
put $filename.zip
bye
EOF
# Remove sql files if any
rm $bkpdir/$filename
done
# Remove compressed files which are 6 months old
find $bkpdir/*.zip -type f -mtime +180 -exec rm {} \;
Agora o problema é que o arquivo compactado no sistema de destino não está sendo extraído usando unzip
o comando e mostra o seguinte erro:
Arquivo: emt_bus-08-09-16-03-29.sql.zip
caution: zipfile comment truncated
error [emt_bus-08-09-16-03-29.sql.zip]: missing 49666528 bytes in zipfile
(attempting to process anyway)
error [emt_bus-08-09-16-03-29.sql.zip]: start of central directory not found;
zipfile corrupt.
(please check that you have transferred or created the zipfile in the
appropriate BINARY mode and that you have compiled UnZip properly)
Eu costumava tar
arquivar, mas sem sorte. Não extrai o arquivo no sistema de destino e mostra o seguinte erro
gzip: stdin: invalid compressed data--format violated
emt_bus-08-09-16-03-29.sql
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Como resolver o problema?
Responder1
Provavelmente você já tem mensagens de erro que simplesmente não vê ao executar esse script.
Capture toda a saída para um log executando-o com
script.sh > log.txt 2>&1
A última parte redireciona stderr para stdout, neste caso log.txt
Provavelmente, o que você descobrirá é que o tempo limite está esgotado (quantos arquivos você está enviando, quão estável é sua conexão) ou talvez um comando que você acha que espera pelo próximo comando, na verdade, não espera no script.
Responder2
Seu script deve ser definido binary
(após os quote
comandos). Caso contrário, usará o modo de texto para este script.
Se fosse interativo, o cliente FTP que acabei de testar assumirá o modo binário. Mas não quando não é interativo.
Isto é o que eu testei/e consertei:
#!/bin/sh
ftp -in invisible-island.net <<EOF
quote USER anonymous
quote PASS anonymous
binary
cd cproto
get cproto.tar.gz
bye
EOF