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

26

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'"

Esta é 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
    
por Terry G Lorber 13.11.2009 / 16:05

4 respostas

59

De crontab (5) :

The ''sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. Percent-signs (%) in the command, unless escaped with backslash (), will be changed into newline characters, and all data after the first % will be sent to the command as standard input. There is no way to split a single command line onto multiple lines, like the shell's trailing "\".

Basta adicionar barras invertidas antes dos sinais%:

00 08 * * * psql -Uuser database < query.sql | mail [email protected] -s "query for 'date +\%Y-\%m-\%dZ\%I:\%M'"
    
por 13.11.2009 / 16:19
5

Para resolver o problema , escove seus% caracteres . date +%Y-%m-%d deve ser date +\%Y-\%m-\%d

Infelizmente esta resposta está um pouco atrasada, mas os problemas não são PATH ou backticks - a questão é simplesmente que o caractere percentual '%' é um caractere especial usado para denotar um NEWLINE ou um STDIN em entradas crontab .

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

date Y- m- d

    
por 07.03.2017 / 20:57
4

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

Exemplo:

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

-Gilson Soares

    
por 13.11.2009 / 17:47
-2

Não tem nada a ver com os backsticks. Uma coisa terrível é que o cron não vê o caminho, e você deve informar ao cron "o que é o PATH?" mais e mais nos scripts cron.

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

E eu 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/

esta linha pode ir dentro de um arquivo, chmod + x, e este arquivo a ser invocado.

    
por 03.02.2017 / 16:43