não está funcionando no crontab

0

Eu notei um número de perguntas semelhantes perguntar e eu também tentei as sugestões postadas, mas eu simplesmente não consigo fazer isso funcionar. Abaixo está o meu código.

#!/bin/bash

while IFS="" read -d "" -r filename;
do
filearray[i++]="$filename"
done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0)
printf '%s\n' "${filearray[0]}"

Simplesmente, eu só quero procurar por todos os arquivos do tipo txt em um diretório específico e colocá-los em uma matriz, que é exibida no final. Quando eu corro da linha de comando, não há problema. Isso funciona bem. Assim que eu executo isso via crontab, recebo o seguinte erro:

syntax error near unexpected token '<'
'done < <(find . -maxdepth 1 -type f -iname "*.txt" -print0)'

Aqui está a própria entrada do cron:

* * * * * . /usr/online/scripts/test.sh 2>> /usr/online/scripts/log/test.log

Por que o script está trabalhando na linha de comando, mas não no crontab? Eu estou declarando o shell, então certamente crontab deve usar o shell? Existe outro por que eu posso fazer isso, o que funciona?

Jakkie

    
por Jakkie 14.02.2017 / 11:39

2 respostas

2

command < <(other command) é um bashism . Como você está especificando uma linha shebang, você deve não especificar um shell em seu crontab; isso é apenas confuso. Você deve fazer um ou outro - eu prefiro muito mais uma linha shebang porque você está sendo explícito sobre a sintaxe que segue, ao invés de fingir ser um script de shell "genérico".

Ah, e certifique-se de tornar seu script executável e colocar somente /path/to/your/script.sh no campo de comando crontab, não sh /path/to/your/script.sh , sh < /path/to/your/script.sh ou até . /path/to/your/script.sh . Os últimos três ignoram a linha shebang e, em vez disso, executam o script no contexto do cron shell, independentemente do que esteja configurado para ser.

Veja as instruções de redirecionamento para obter mais informações sobre como salvar a saída do script em um arquivo.

    
por 14.02.2017 / 11:45
0

Assumindo que o script é executável e está fazendo a coisa certa quando invocado a partir da linha de comando, escreva sua entrada crontab assim (para executar a cada 15 minutos):

*/15 * * * * /path/to/script.sh >/path/to/output 2>/path/to/errors
    
por 14.02.2017 / 12:01

Tags