Gestione dei file di registro creati dai lavori cron

Ho un lavoro cron che copia il suo file di registro ogni giorno nella mia cartella home.

Ogni giorno sostituisce il file esistente nella cartella di destinazione, come previsto. Voglio conservare il log dalle date precedenti in modo che la volta successiva copi il file nella cartella di destinazione, conserva i file delle date precedenti.

Come lo faccio?

Il modo migliore per gestire i registri cron è disporre di un wrapper per ogni processo. Il wrapper potrebbe fare queste cose, al minimo:

  • inizializza l’ambiente
  • redirect stdout e stderr per accedere
  • eseguire il lavoro
  • eseguire controlli per vedere se il lavoro è riuscito o meno
  • inviare notifiche se necessario
  • ripulire i registri

Ecco una versione nuda di 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=[$*]" "[email protected]" echo "$(date): cron ended, exit code is $?" 

La tua riga di comando di cron sarà simile a:

 /path/to/cron_wrapper command ... 

Una volta che questo è a posto, possiamo avere un altro lavoro chiamato cron_log_cleaner che può rimuovere i registri più vecchi. Non è una ctriggers idea chiamare il log cleaner dal wrapper di cron stesso, alla fine.


Un esempio:

 # 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 

Il log dovrebbe contenere questo dopo aver eseguito il job cron avvolto:

 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 

Inserire

 `date +%F` 

al tuo comando cp , come questo:

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

quindi copierà src_file in dst_file_2017-01-20