Administrar archivos de registro creados por trabajos cron

Tengo un trabajo cron que copia su archivo de registro diariamente en mi carpeta de inicio.

Todos los días anula el archivo existente en la carpeta de destino, que se espera. Deseo conservar el registro de fechas anteriores para que la próxima vez que copie el archivo a la carpeta de destino, conserve los archivos de fechas anteriores.

¿Cómo puedo hacer eso?

La mejor forma de administrar los registros cron es tener un contenedor alrededor de cada trabajo. El contenedor podría hacer estas cosas, como mínimo:

  • Inicializar el entorno
  • redirigir stdout y stderr para iniciar sesión
  • ejecutar el trabajo
  • realizar comprobaciones para ver si el trabajo tuvo éxito o no
  • enviar notificaciones si es necesario
  • limpiar los registros

Aquí hay una versión escueta de un contenedor 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=[$*]" "$@" echo "$(date): cron ended, exit code is $?" 

Su línea de comando cron se vería así:

 /path/to/cron_wrapper command ... 

Una vez que esto esté en su lugar, podemos tener otro trabajo llamado cron_log_cleaner que puede eliminar registros más antiguos. No es una mala idea llamar al limpiador de registro desde el envoltorio de cron, al final.


Un ejemplo:

 # 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 

El registro contendría esto después de ejecutar el trabajo cron envuelto:

 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 

Insertar

 `date +%F` 

a tu comando cp , así:

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

entonces copiará src_file a dst_file_2017-01-20