script de log de e-mail de backup me irrita: expansão BASH enlouquecida

2

Eu tenho um script BASH que "lê" os logs de backup, relata o sucesso / fracasso do último backup, lista o conteúdo do diretório de backup e envia os resultados por e-mail. Depois de mover os backups para um novo servidor e transformar a rotina de email em funções, ele me envia um email. Parece que está expandindo a data e enviando um e-mail para cada data em que ela se expande. Eu não posso ver como para a minha vida. Aqui está um código de "MAIN":

YDATE=$(date -s "yesterday" '+%a%b%d')
BKPLOG="/mnt/nfs/horizon/backuplog_$YDATE.log"

STATUS=$(cat /mnt/nfs/horizon/backuplog_$YDATE.log)

# Catenate logs and status into message body -- email report to 
# Support.
func_make_msg $MSG "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send $MSG "[email protected]" # Send it!

func_make_message apenas cria a mensagem. Note que nenhuma função está em um loop for ou while. Aqui está a função de envio:

function func_send ()
{
    local _message=$1
    local _cc=$2
    local _recipient=$3
    $PRINT --columns=2 -t < $_message | $MAIL -s "Backup Logs" "$_cc"
}

Minha caixa de entrada mostra um e-mail de cada data nos registros de backup toda vez que eu o executo. agradecidamente Eu limpei os antigos, caso contrário, minha caixa de entrada ainda estaria enlouquecendo.

O servidor de backup é o Debian. Script executado em um cron job:

0 7 * * *      bash /home/bkpadmin/scripts/backup_mail.sh

alguma ideia? O tempo estava fora de uma milha, mas eu eliminei o fator cron do ntp executando manualmente. Eu obtenho os mesmos resultados mesmo depois de consertar a hora / data e executá-la manualmente.

Aqui está a função func_make_msg para os curiosos:

function func_make_msg ()
{
    local _msg_body=$1
    local _file=$2
    local _backup_status=$3
    local _db_backups=$4
    cat > $_msg_body << EOM 
## Nightly backup logs ###########################
** Backup Status **
File name: $_file
$_backup_status
---------------

** Important DB Server ****
$_db_backups
---------------
EOM
}

Obrigado ~

Bubnoff

UPDATE Obrigado Dennis. Foi isso. Um erro idiota e estúpido da minha parte. Os resultados de loop-esque resultantes são interessantes. Eu sou o dobro do tolo, como eu realmente li a man page para me lembrar como calcular "ontem". Trocado por 'd'. 'S' como em "string" eu acho. ... Para mais estupidez ... continue a ler ...

Isso não aconteceu durante o teste porque o script pertencia e era executado em uma conta de usuário comum. O comando date -s falhou, mas ainda saiu ontem ... simplesmente não definiu a data do sistema ... falta de permissões e tudo. Aponta para o meu segundo erro ... ainda mais idiota ... a entrada do cron foi para root. Outro exemplo de por que nunca se deve executar scripts como root, nem logar como root, a menos que não haja outra maneira.

O script foi capaz de alterar a data da data do sistema e estragar maciçamente à medida que a variável foi expandida repetidamente, graças a ter poderes enraizados. Estou me entregando às autoridades competentes enquanto falamos. Desculpe, mundo.

Alguém pode ver outros erros estúpidos enquanto estamos falando sobre o assunto?

    
por Bubnoff 01.10.2010 / 18:47

1 resposta

1

Minha primeira recomendação é que você cite $MSG nessas linhas:

func_make_msg "$MSG" "$RPT" "$STATUS" "$DB_SERV_BACKUP_LISTING"
func_send "$MSG" "[email protected]" # Send it!

e $_message nesta linha

$PRINT --columns=2 -t < "$_message" | $MAIL -s "Backup Logs" "$_cc"

Mas presumo que esses sejam nomes de arquivos e que eles não sejam a fonte do seu problema.

Você pode eliminar cat nesta linha:

STATUS=$(< /mnt/nfs/horizon/backuplog_$YDATE.log)

Mas, novamente, não é problema seu.

Editar:

Acho que encontrei seu problema: date -s define a data e a hora. Tente remover o -s .

    
por 01.10.2010 / 19:24