linux - onde - Gerenciando arquivos de log criados por tarefas cron



linux view crontab log (2)

A melhor maneira de gerenciar os logs do cron é ter um wrapper em torno de cada trabalho. O wrapper poderia fazer essas coisas, no mínimo:

  • inicializar ambiente
  • redirecione stdout e stderr para o log
  • executar o trabalho
  • faça verificações para ver se o trabalho foi bem-sucedido ou não
  • envie notificações se necessário
  • limpar logs

Aqui está uma versão básica de um wrapper cron:

#!/bin/bash

log_dir=/tmp/cron_logs/$(date +'%Y%m%d')
mkdir -p "$log_dir" || { echo "Can't create log directory '$log_dir'"; exit 1; }

#
# we write to the same log each time
# this can be enhanced as per needs: one log per execution, one log per job per execution etc.
#
log_file=$log_dir/cron.log

#
# hitherto, both stdout and stderr end up in the log file
#
exec 2>&1 1>>"$log_file"

#
# Run the environment setup that is shared across all jobs.
# This can set up things like PATH etc. 
#
# Note: it is not a good practice to source in .profile or .bashrc here
#
source /path/to/setup_env.sh

#
# run the job
#
echo "$(date): starting cron, command=[$*]"
"[email protected]"
echo "$(date): cron ended, exit code is $?"

Sua linha de comando cron ficaria assim:

/path/to/cron_wrapper command ...

Uma vez instalado, podemos ter outro trabalho chamado cron_log_cleaner que pode remover logs mais antigos. Não é uma má idéia chamar o limpador de log do próprio wrapper cron, no final.

Um exemplo:

# run the cron job from command line
cron_wrapper 'echo step 1; sleep 5; echo step 2; sleep 10'

# inspect the log
cat /tmp/cron_logs/20170120/cron.log

O log conteria isso após a execução do trabalho cron empacotado:

Fri Jan 20 04:35:10 UTC 2017: starting cron, command=[echo step 1; sleep 5; echo step 2; sleep 10]
step 1
step 2
Fri Jan 20 04:35:25 UTC 2017: cron ended, exit code is 0

https://ffff65535.com

Eu tenho um trabalho cron que copia seu arquivo de log diariamente para minha pasta pessoal.

Todos os dias, ele substitui o arquivo existente na pasta de destino, o que é esperado. Quero preservar o log de datas anteriores, para que da próxima vez que copie o arquivo na pasta de destino, os arquivos sejam preservados de datas anteriores.

Como faço isso?


Inserir

`date +%F`

ao seu comando cp , assim:

cp /path/src_file /path/dst_file_`date +%F`

então ele copiará src_file para dst_file_2017-01-20

upd:

Como o @tripleee notou, o caractere % deve ser escapado no cron , para que seu trabalho cron fique assim:

0 3 * * * cp /path/src_file /path/dst_file_`date +\%F`




cron