trabalho cron não redireciona a saída para o arquivo [duplicado]

0
    

Esta pergunta já tem uma resposta aqui:

    

Eu defino a seguinte linha no cron job em /etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

este cron deve encontrar os logs com mais de 10 dias (mas somente se a pasta /var/log/ambari-metrics-collector existir)

de algum motivo não claro, notamos que /var/log/find_old_file não foi criado

e quando testamos esta linha funciona bem no bash do shell, mas não no cron

também adicionamos 2 > & 1 no final do arquivo, mas isso não funciona

por favor, avise o que está errado no meu trabalho no cron?

more /etc/cron.d/find_old_file

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'   >>    /var/log/find_old_file 2>&1

exemplo quando testamos em bash

 [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n'
2018 Aug 13 12:54 collector-gc.log-201808130951
2018 Aug 13 04:22 collector-gc.log-201808130403
2018 Aug 01 12:40 gc.log-201808011229
2018 Aug 01 12:40 collector-gc.log-201808011229
2018 Aug 09 15:36 gc.log-201808091332
2018 Aug 09 10:50 gc.log-201808090825
2018 Aug 13 04:02 collector-gc.log-201808130346
2018 Aug 13 16:51 gc.log-201808131358
2018 Aug 01 13:35 gc.log-201808011241
2018 Aug 01 13:35 collector-gc.log-201808011241
2018 Aug 09 15:39 collector-gc.log-201808091332
2018 Aug 02 23:06 gc.log-201808022256

quando eu coloco isso

* * * * * root echo test  >> /var/log/test

então seus trabalhos, mas não minha linha como descrito

então o que acontece aqui?

    
por yael 29.08.2018 / 19:10

2 respostas

3

O sinal % no crontab veja o man (5) crontab tem especial significando (newline) e para obter o seu trabalho de comando você precisa escapar deles.

A "%" character in the
   command, unless escaped with a backslash (\), will be changed into
   newline characters, and all data after the first % will be sent to
   the command as standard input.

então, seu comando deve ser:

* * * * * root  [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '\%TY \%Tb \%Td \%TH:\%TM \%P\n' >> /var/log/find_old_file
    
por 29.08.2018 / 20:02
2

Crie um arquivo shell executável

cat /root/bin/find_old_file
    #!/bin/sh
    [[ -d /var/log/ambari-metrics-collector ]] && find  /var/log/ambari-metrics-collector   -type f -mtime +10 -regex '.*\.log.*[0-9]$' -printf '%TY %Tb %Td %TH:%TM %P\n' >> /var/log/find_old_file

que você executa via cron

cat /etc/cron.d/find_old_file
    * * * * * root  /root/bin/find_old_file

Se um script precisar ser reformatado para se adequar ao cron, geralmente é melhor movê-lo para fora do cron.

    
por 29.08.2018 / 20:19

Tags