escript cron blues
-
22-09-2019 - |
Pergunta
Eu tenho um arquivo escript que funciona bem na linha de comando, ou seja:
./escript_file
Ele foi projetado para ser compatível com cron e todos os caminhos são explícitos, mas quando eu o executo, ele não consegue compilar dizendo que existem bad attributes
.
Os atributos ruins em questão são definições de macro:
-define(COOKIE, 'somecookie').
A resposta
Graças à sugestão de Geoff Ready, investiguei qual versão do Erlang estava rodando imprimindo init:script_id()
que imprime uma string como {"OPT APN 181 O1", "R13B"}
e, com certeza, a linha de comando e as versões do cron estavam escolhendo versões diferentes.
O script tinha uma linha inicial:
#!/usr/bin/env escript
e o sistema operacional estava 'encontrando' Erlang para mim.As diferentes variáveis de ambiente do cron significavam que um erlang diferente estava sendo escolhido (a primeira resposta de Geoff, e uma que eu conhecia, mas não conseguia ver como isso afetaria as coisas).
A solução é então forçar a versão com uma linha inicial de:
#!/usr/local/lib/erlang/erts-5.7.3/bin/escript
Pós-escrito
Havia também um Ubuntu diferente apt-get
instalação de uma versão anterior do Erlang (em um local diferente da instalação de origem) e uma instalação incorreta de 64 bits...
O ambiente cron continuava voltando para instalações mais antigas e obscuras, falhando o tempo todo :(
Solução
Talvez o cron esteja escolhendo uma versão diferente do erlang no caminho. Documentação Erlang R12B diz que o escript ignora as diretivas do pré-processador além de include_lib. Documentação Erlang R13B diz que o pré-processador é executado no arquivo.Isso definitivamente explicaria a diferença de comportamento.
Outras dicas
Se estiver funcionando bem na linha de comando, uma causa provável é uma diferença nas variáveis de ambiente do seu shell interativo em comparação com quando o cron executa o script.