/etc/cron.d/cronjob

1

Estou tentando fazer um cronjob em /etc/cron.d/ para executar o primeiro sábado de cada mês.

Aqui está o que eu tenho até agora:

0 1 1-7 * 6 ['date +\%d' == 06] root && /home/test/cron-test.sh

Eu altero a data do sistema em 14 de janeiro de 2017 (um sábado de 2017) à meia-noite e verifiquei tail /var/log/syslog | grep cron-test relatórios:

Jan 14 00:59:21 Inspiron-1545 cron[936]: Error: bad username; while reading /etc/cron.d/cron-check1
Jan 14 00:59:21 Inspiron-1545 cron[936]: (*system*cron-check1) ERROR (Syntax error, this crontab file will be ignored)

O que estou fazendo de errado?

    
por john7a8 16.06.2017 / 23:27

1 resposta

4

Os crontabs de todo o sistema têm os cinco campos de data e hora em cada linha, depois o nome de usuário para executar o cronjob como e, em seguida, a linha de comando. Na sua, os campos de tempo parecem ok, mas o sexto campo ['date é bastante estranho para um nome de usuário. A mensagem de erro sugere isso.

Como você tem root mencionado depois do parênteses entre parênteses, acho que você pode ter perdido o nome de usuário, então você deve ter:

0 1 1-7 * 6 root ['date +\%d' == 06] && /home/test/cron-test.sh

Isso ainda tem o problema de que [ é um comando como os outros, então você tem que usar espaço em branco após o [ e antes do ] . E == não é padrão para comparação, = é. Além disso, para a substituição de comandos, $(cmd) é apenas melhor que os backticks, então vamos tentar:

0 1 1-7 * 6 root [ $(date +\%d) = 06 ] && /home/test/cron-test.sh

Mas date +%d informa o dia do mês e, agora, você está executando apenas no sexto dia do mês (independentemente do dia da semana). O terceiro e quinto campos (dia do mês e dia da semana) funcionam um pouco estranhamente juntos: o cronjob é executado se qualquer deles corresponder. Mas queremos correr apenas em um sábado e apenas no primeiro ao sétimo dia do mês, então temos que verificar uma das condições manualmente.

0 1 1-7 * * root [ $(date +\%u) -eq 6 ] && /home/test/cron-test.sh

O próprio cronjob é executado em todos os primeiros sete dias do mês, mas o teste manual [ $(date +%u) -eq 6 ] verifica se o dia da semana é sábado, antes de executar o comando principal.

(Algumas versões da página de manual crontab(5) têm um exemplo quase assim, mas não consigo encontrar uma versão online dele.)

    
por 16.06.2017 / 23:48

Tags