Executar o mesmo script bash produz resultados diferentes quando executado a partir do shell ou como uma tarefa cron.
Descrição
- Crie um arquivo de texto simples com conteúdo
touch /tmp/forbashtest ; printf "Lorem ipsum we have Release 1.1.5 version and also should be \$dbstore variable in text so let's check\n" > /tmp/forbashtest
- Crie um bash simples (por exemplo, text_ask.sh) para verificar se existe um texto dentro deste arquivo
#!/bin/bash
version=$(/usr/bin/ack "Release 1.1.5" /tmp/forbashtest | wc -l) ; printf "version count = $version\n" ;
dbexist=$(/usr/bin/ack "dbstore" /tmp/forbashtest | wc -l) ; printf "dbexist count = $dbexist\n" ;
if [[ "$version" -eq "0" ]] && [[ "$dbexist" -eq "0" ]] ; then
echo "Version CHANGED and DB insert not exists";
else
echo "Version still 1.1.5 and DB INSERT at place";
fi
exit ;
sh
Primeira execução do shell
sh /a/test_ask.sh > /tmp/test_ask_shell.txt ;
Saída /tmp/test_ask_shell.txt - resposta VERDADEIRA como deveria ser
version count = 1
dbexist count = 1
Version still 1.1.5 and DB INSERT at place
Segunda execução como cronjob adicionando a seguinte linha em /var/spool/cron/root
15 6 * * * sh /a/test_ask.sh > /tmp/test_ask_cron.txt ;
Saída /tmp/test_ask_cron.txt - resposta FALSA!
version count = 0
dbexist count = 0
Version CHANGED and DB insert not exists
A questão é - COMO ISSO PODERIA ACONTECER? Não vejo nenhuma lógica.
chown 0755 /a/test_ask.sh não ajudou, defina o caminho absoluto /usr/bin/ack em vez de apenas "ack" - o mesmo.
O serviço crond "AS IF" que usa /var/spool/cron/root não tem privilégios de root suficientes para executar comandos em script BASH ou algo parecido.
O Alma9 é baseado no CentOS, mas nunca encontrei um problema assim com o CentOS. Todos os scripts executados no serviço CROND (ou serviço LOGROTATE) estavam tendo o mesmo desempenho que os executados diretamente do shell root.
Ficaria muito grato pelas ideias para entender e tentar consertar,
Eu instalei
ack
e executei sua configuração +ack
chamadas raw no script. Asack
chamadas raw não geram saída (daí as0
contagens) quando executadas porcron
.Executando uma pesquisa na web,
ack AND cron
encontrei este link do problema do github . O OP tem o mesmo problema, ou seja,ack
não funciona comcron
.No final desse link, o usuário hoelzro fornece a seguinte explicação:
Então, quando executado,
cron
ack
não detecta nenhum tty e, portanto, alterna para procurar por entrada de um pipe ou redirecionamento de arquivo, e como nenhuma entrada existe (nesse caso), a entrada é efetivamente "vazia" e nenhuma saída é gerada, o que significa quewc -l
retorna0
.A solução/solução alternativa: adicionar
--nofilter
àack
chamada, por exemplo:De
ack --help
:Depois de adicionar
--nofilter
todas asack
chamadas, meucrontab
trabalho agora gera os resultados esperados:NOTA: Estou apenas passando adiante o que encontrei em minha breve pesquisa; não tenho nada a ver com o design ou desenvolvimento,
ack
então não posso dizer por que ele se comporta dessa maneira.