Como posso executar 'date' dentro de uma tarefa da guia cron?

89

Eu quero criar um arquivo de log para um script cron que tenha a hora atual no nome do arquivo de log. Este é o comando que tentei usar:

0 * * * * echo hello >> ~/cron-logs/hourly/test'date "+%d"'.log

Infelizmente, recebo esta mensagem quando isso é executado:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '''
/bin/sh: -c: line 1: syntax error: unexpected end of file

Eu tentei escapar da parte date de várias maneiras, mas sem muita sorte. É possível fazer isso acontecer in-line em um arquivo crontab ou eu preciso criar um script de shell para fazer isso?

    
por cwd 20.01.2012 / 18:12

5 respostas

142

Resposta curta:

Tente isto:

0 * * * * echo hello >> ~/cron-logs/hourly/test'date "+\%d"'.log

Observe a barra invertida escapando do sinal % .

Resposta longa:

A mensagem de erro sugere que o shell que executa seu comando não vê o segundo caractere de carrapato:

/bin/sh: -c: line 0: unexpected EOF while looking for matching '''

Isso também é confirmado pela segunda mensagem de erro recebida quando você tentou uma das outras respostas:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ')'

A página do crontab confirma que o comando é lido apenas até o primeiro sinal % sem escape:

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 cronfile. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline charac- ters, and all data after the first % will be sent to the command as standard input.

    
por 20.01.2012 / 18:31
7

Você também pode colocar seus comandos em um arquivo shell e depois executar o arquivo shell com o cron.

jobs.sh

echo hello >> ~/cron-logs/hourly/test'date "+%d"'.log

cron

0 * * * * sh jobs.sh
    
por 03.07.2015 / 16:41
6

Se você gostaria de fazer a string de formatação de data como uma variável (para evitar a duplicação da string inteira), NÃO escape de % e NÃO coloque em $()

Por exemplo, ao declarar a string, escreva:

DATEVAR=date +%Y%m%d_%H%M%S

Em seguida, escreva a instrução cron com $($VARIABLE_NAME) da seguinte forma:

* * * * * /bin/echo $($DATEVAR) >> /tmp/crontab.log

Agradecemos a cyberx86 , sua resposta em ServerFault pode ser mais completa:

    
por 04.01.2016 / 09:41
2

No cron, você pode usar esta sintaxe simples:

*/15 01-09 * * * sh /script.sh >> /home/username/cron_$(date -d"-0 days" +\%Y\%m\%d).log 2>&1
    
por 24.01.2018 / 14:50
2

Todas as respostas acima usam aspas duplas (nem todas elas funcionaram para minha configuração). Isso funcionou para mim:

0 5 * * 3 /data/script.sh > /data/script_'date +\%y\%m\%d'.log 2>&1
    
por 25.09.2018 / 10:46