O trabalho do Cron não está funcionando corretamente no arranque

3

Obrigado por ler isto.

Eu criei um script bash para fazer backup dos meus bancos de dados. O script criará um diretório para o dia e criará um arquivo de backup para cada banco de dados dentro desse diretório.

Ele é executado como esperado se eu chamá-lo da linha de comando.

Eu quero que ele seja executado quando a máquina inicializar, então eu criei uma tarefa cron para executá-la.

Quando a tarefa do cron é executada, ela cria o diretório, mas não cria os arquivos.

Verifiquei o syslog e posso ver a tarefa cron sendo processada, mas não há saída que indique um erro. Há uma mensagem que parece sugerir que um e-mail teria sido enviado se o postfix ou algum outro fosse instalado. Eu realmente não quero instalar o postfix a menos que eu realmente precise.

Existe algum outro log que eu possa estar olhando?

Aqui está o cron job (ele é executado como root):

@reboot /usr/bin/db.backup.sh

aqui está o script bash:

#!/bin/bash

DB_BACKUP="/files/database_backups/'date +%Y-%m-%d'"
DB_USER="root"
DB_PASSWD="a"
HN='hostname | awk -F. '{print $1}''

# Create the backup directory
mkdir -p $DB_BACKUP

# Remove backups older than 10 days
find /files/database_backups/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;

# Backup each database on the system
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -viE '(staging|performance_schema|information_schema)');
do mysqldump --max-allowed-packet=1073741824 --user=$DB_USER --password=$DB_PASSWD --events --opt --single-transaction $db | gzip > "$DB_BACKUP/$db-$(date +%Y-%m-%d).sql.gz";
chown -R www-data:www-data $DB_BACKUP
done
    
por Simon 30.07.2014 / 14:20

1 resposta

1

Os scripts executados no cron não possuem o mesmo ambiente de quando você o executa a partir da linha de comando.

Isso pode ser porque o PATH definido no cron não inclui o diretório em que mysql e mysqldump estão localizados.

Ou use o caminho completo ao fazer referência a esses comandos no seu script, como /usr/bin/mysql ou crie uma nova variável PATH no início do seu script:

export PATH=/bin:/usr/bin

Ou apontando para qualquer outro diretório onde mysql e mysqldump estejam instalados se você não instalou o MySQL usando o pacote padrão do Ubuntu.

Para manter as possíveis mensagens de erro que seriam produzidas quando o script é executado a partir do cron, se você não receber um e-mail localmente, você pode simplesmente adicionar o redirecionamento de saída à sua definição de crontab da seguinte forma:

@reboot /usr/bin/db.backup.sh >/tmp/db-backup.log 2>&1

Qualquer mensagem, informação e erro serão encontrados posteriormente em /tmp/db-backup.log .

Considere o uso de '> >' em vez de '>' na linha acima, se você quiser acrescentar as informações e não sobrescrever o arquivo de log a cada execução.

Atualização: se o cron job for executado antes do servidor MySQL ser ativado

Se o script for executado no processo de inicialização da máquina, antes que o servidor MySQL esteja ativo, você poderá implementar uma pequena verificação no início do script para aguardar que o arquivo de soquete do MySQL esteja presente:

while [ ! -e /var/run/mysqld/mysqld.sock]; do
  # if the file doesn't exist, will loop
do

Atenção : se o MySQL nunca aparecer por algum motivo, o script fará um loop para sempre.

    
por Benoit 30.07.2014 / 14:48

Tags