Por que meu script de backup funciona quando eu o executo, mas não quando é executado via cron?

2

Este é o meu script, backup_mongo.sh

#!/bin/bash
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix

No meu crontab -e :

0   3  *   *   *    /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

Quando executo o script normalmente (executando o comando acima), o script funciona e o diretório "mydb" é criado no / mongo- $ suffix.

No entanto, quando eu coloco isso no crontab, o / mongo- $ suffix é criado, mas o diretório "mydb" não existe. Não há nada no sufixo / mongo- $.

    
por Alex 15.05.2011 / 22:20

3 respostas

4

Você pode não ter mongodump no seu PATH . Tente usar o caminho absoluto para o comando mongodump .

    
por 15.05.2011 / 22:23
2

É muito provável que seja um problema no PATH, mas eu recomendo não substituir o PATH no seu crontab, porque é

  • muito fácil de evitar o comportamento
  • pode ser um risco de segurança

Seu bom estilo de codificação bash / sh para definir cada binário com o qual você deseja acionar, com seu caminho completo como variável

!#/bin/bash

RSYNC="/usr/bin/rsync"

e consulte a variável mais tarde.

$RSYNC /foo/bar baz

Existem também certas opções para alterar o usuário que está executando o crontab. Supondo que exista um usuário chamado mongodump que tenha definido um PATH que inclua o mongodump, você pode se tornar esse usuário e editá-lo. Ou você também pode usar

/bin/bash /bin/su - mongodump -c /bin/bash /home/myuser/myproject/production/backup_mongo.sh

no crontab das raízes.

    
por 15.05.2011 / 23:31
1

O PATH padrão para o cron é restrito. Geralmente é /usr/bin:/bin . Se você quiser executar qualquer coisa fora desses diretórios, você tem várias opções

Use caminhos completos para os comandos, por exemplo /path/to/mongodump/mongodump ...

Defina um PATH estendido no crontab, por exemplo,

    PATH=/usr/bin:/bin/:/path/to/mongodump
    0 3 * * * /bin/bash  /home/myuser/myproject/production/backup_mongo.sh  localhost user1 pass1

Defina o PATH no script que você está executando

#!/bin/bash
PATH=/usr/bin:/bin:/paath/to/mongodump
suffix=$(date +%w)
rm /home/myuser/backup/mongo-$suffix -rf
mkdir /home/myuser/backup/mongo-$suffix
mongodump -h$1 -u$2 -p$3 -dmydb -o/home/myuser/backup/mongo-$suffix
    
por 15.05.2011 / 22:56