linux - Administrar archivos de registro creados por trabajos cron
bash unix (2)
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. Quiero preservar 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?
Insertar
`date +%F`
a su comando
cp
, así:
cp /path/src_file /path/dst_file_`date +%F`
entonces copiará
src_file
a
dst_file_2017-01-20
upd:
Como @tripleee notó,
%
character debería escapar en
cron
, por lo que su trabajo cron se verá así:
0 3 * * * cp /path/src_file /path/dst_file_`date +/%F`
La mejor manera de administrar registros cron es tener un contenedor alrededor de cada trabajo. El contenedor podría hacer estas cosas, como mínimo:
- inicializar entorno
- redirigir stdout y stderr para iniciar sesión
- ejecutar el trabajo
- realizar verificaciones para ver si el trabajo fue exitoso o no
- enviar notificaciones si es necesario
- limpiar registros
Aquí hay una versión básica 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 los registros más antiguos.
No es una mala idea llamar al limpiador de registros desde el contenedor 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