Problema usando o BASH no cron (FreeBSD)

1

Cenário: Nós temos um sistema legado rodando o FreeBSD 4.7 (por favor, sem risos. Está sendo retirado no final do ano. Eu só preciso mantê-lo ativo e backup até então) e tenho alguns scripts de despejo de banco de dados. que corro diariamente com um cron job. Eu começo o script com #! / Usr / local / bin / bash. O script usa o comando date para colocar a data como parte do nome do arquivo de despejo. Quando executo o script manualmente, ele funciona como esperado. No entanto, quando eu colocá-lo em um cron job, ele falha. Eu chequei meu log de erro e ele está falhando na parte do script onde eu uso backticks e o comando date para o nome do arquivo (eu também tentei $ (date ...) no nome do arquivo e isso deu o mesmo erro. Em seguida, tentei adicionar / usr / local / bin / bash /path/to/script.sh no cronjob e ainda tinha o mesmo erro.

Então, meu palpite é que não está mudando para um shell bash quando é executado. Primeiro pensei em adicionar echo $ SHELL ao meu script para ver, mas descobri que as shells de comutação não mudam o valor da variável SHELL.

Alguém já teve um problema parecido com o FreeBSD? Ou alguém sabe uma maneira alternativa de verificar qual shell está usando na execução? (Eu também tentei ps > > test.txt e isso também não funcionou no cron).

    
por Safado 14.06.2011 / 19:21

3 respostas

2

Algumas coisas me ocorrem enquanto leio isso.

Se você estiver executando o bash, o valor de $ BASH deve se expandir para o caminho completo e o nome do arquivo do executável bash em uso.

Como você está chamando a data no seu script? Você está chamando-o com o nome completo do caminho ou como "data". O último caso pode resultar no uso de funções, aliases ou o que acontecer de ser o primeiro no caminho, em vez do programa de datas que você espera.

O Bash se comportará de maneira diferente em alguns casos, dependendo do ambiente. Você pode querer despejar o ambiente em um arquivo do script e examiná-lo a partir da linha de comando e do cron. Você pode achar que o PATH é diferente ou que alguma outra variável de ambiente é definida de maneira diferente. Você deve ser capaz de despejar isso em um arquivo em / tmp, colocando uma linha como "env > /tmp/environment.$$" no script. Cada vez que o script é executado, ele imprime o ambiente em um arquivo denominado environment (pid of script)

Você pode definir também o shell para o crontab inteiro para o shell que você quiser usando "SHELL = / path / to / new / shell" em uma linha por si só.

    
por 14.06.2011 / 19:53
0

Tente definir explicitamente as variáveis de ambiente (por exemplo, PATH ) ou explicitamente o fornecimento de arquivos de inicialização (por exemplo, /etc/profile ou /home/root/.profile ou qualquer outro).

Se o cron estiver assumindo outro shell, convém exec o script bash.

    
por 14.06.2011 / 19:52
0

Pelo menos algumas versões do cron interpretam '%' como um caractere especial. Eu não posso dizer a partir da sua resposta acima se você usar esse comando de data no próprio crontab. Consulte a sua página de manual. É

man 5 crontab

A outra página man crontab é para o comando crontab e não o formato do arquivo.

no linux, mas não tenho certeza sobre bsd.

Se for esse o caso, você pode corrigir isso escapando do% com um \ na frente dele.

    
por 21.06.2011 / 05:30