O que há de errado com a sintaxe do meu cronjob, estou tentando usar um backtick (`)?

31

Aqui está o que eu gostaria de automatizar:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +%Y-%m-%dZ%I:%M`"

Aqui está a mensagem de erro:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Terry G Lorber
fonte
2
Além do erro de dar, considere colocar isso em um script schell. Ele fingirá que o crontab é desajeitado e você pode adicionar comentários e configurações ao seu arquivo de script.
31413 PeterMmm

Respostas:

67

Do crontab (5) :

O campo `` sexto '' (o restante da linha) especifica o comando a ser executado. Toda a parte do comando da linha, até uma nova linha ou caractere%, será executada por / bin / sh ou pelo shell especificado na variável SHELL do arquivo crontab. Os sinais de porcentagem (%) no comando, a menos que sejam escapados com barra invertida (), serão alterados para caracteres de nova linha e todos os dados após o primeiro% serão enviados ao comando como entrada padrão. Não há como dividir uma única linha de comando em várias linhas, como o "\" à direita do shell.

Basta adicionar barras invertidas antes dos sinais de%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for `date +\%Y-\%m-\%dZ\%I:\%M`"
Juliano
fonte
8

Para resolver o problema, escape dos% caracteres . date +%Y-%m-%ddeveria estardate +\%Y-\%m-\%d

Infelizmente, esta resposta está um pouco atrasada, mas o problema não é PATH ou backticks - o problema é simplesmente que o caractere de porcentagem '%' é um caractere especial usado para denotar um NEWLINE ou um STDIN nas entradas do crontab .

Isso entra em conflito com a entrada de formatação do datecomando. Como um comando que inclui: date +%Y-%m-%dserá interpretado como:

date Y- m- d

Eric Kigathi
fonte
4

Eu também tive muitos problemas com retalhos. Às vezes, você precisa de mais de uma ocorrência de aspas e backticks. Apenas substitua-os por $ ().

Exemplo:

export NOW=`date`
by
export NOW=$(date)

-Gilson Soares

Guilsson
fonte
11
+1 Essa é a sintaxe preferida hoje em dia, de qualquer maneira.
11119 Dan Carley
4
mas não tem nada a ver com a pergunta do usuário.
23413 Aaron Brown
11
é claro que tem, é sobre backsticks, leia a pergunta novamente.
Sergio Abreu
Obrigado, ele me levou um tempo para perceber os acentos graves estavam quebrando meus crons - Eu comecei usando $ () em todos os meus scripts agora também
Eric Kigathi
-2

Não tem nada a ver com bastões. Uma coisa terrível é que o cron NÃO vê o PATH, e você DEVE dizer ao cron "o que é o PATH?" repetidamente nos scripts cron.

PATH=/bin:/usr/bin:/usr/sbin
* * * * * /your/script/here

E sou a favor de escrever o comando em um arquivo em vez de passar o comando literalmente na linha cron. É muito mais elegante ter

* * * * * /your/script/here

do que

* * * * * perl -e '$@#$@$%%@' | grep -e '@#$@$#$@' | sed s/asfdf/asdfa/

essas linhas podem ir dentro de um arquivo, chmod + x, e esse arquivo a ser chamado.

Sergio Abreu
fonte