Gestion des fichiers journaux créés par les tâches cron

J’ai un travail cron qui copie chaque jour son fichier journal dans mon dossier personnel.

Chaque jour, il remplace le fichier existant dans le dossier de destination, ce qui est attendu. Je souhaite conserver le journal des dates précédentes afin que la prochaine fois qu’il copie le fichier dans le dossier de destination, il conserve les fichiers des dates précédentes.

Comment je fais ça?

La meilleure façon de gérer les journaux Cron consiste à placer un wrapper autour de chaque tâche. Le wrapper pourrait faire ces choses, au minimum:

  • initialiser l’environnement
  • redirige stdout et stderr pour se connecter
  • faire le travail
  • effectuer des vérifications pour voir si le travail a réussi ou non
  • envoyer des notifications si nécessaire
  • nettoyer les journaux

Voici une version simplifiée d’un 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=[$*]" "$@" echo "$(date): cron ended, exit code is $?" 

Votre ligne de commande cron ressemblerait à ceci:

 /path/to/cron_wrapper command ... 

Une fois que cela est en place, nous pouvons avoir un autre travail appelé cron_log_cleaner qui peut supprimer les anciens journaux. Ce n’est pas une mauvaise idée d’appeler le nettoyeur de journaux depuis l’enveloppe cron elle-même, à la fin.


Un exemple:

 # 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 

Le journal contiendrait ceci après l’exécution du job cron enveloppé:

 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 

Insérer

 `date +%F` 

à votre commande cp , comme ceci:

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

il va donc copier src_file dans dst_file_2017-01-20