Управление файлами журналов, созданных cron-заданиями

У меня есть задание cron, которое ежедневно копирует файл журнала в мою домашнюю папку.

Каждый день он переопределяет существующий файл в целевой папке, что ожидается. Я хочу сохранить журнал из предыдущих дат, чтобы в следующий раз, когда он копирует файл в папку назначения, он сохраняет файлы с предыдущих дат.

Как это сделать?

Ответ 1

Лучший способ управлять журналами cron - обертка вокруг каждого задания. Обертка могла бы сделать это, как минимум:

  • инициализировать среду
  • перенаправить stdout и stderr в журнал
  • выполнить задание
  • выполнить проверки, чтобы проверить, выполнено ли задание или нет.
  • при необходимости отправлять уведомления
  • очистка журналов

Ниже приведена версия обложки 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 $?"

Ваша командная строка cron будет выглядеть так:

/path/to/cron_wrapper command ...

Как только это будет сделано, мы можем получить другое задание cron_log_cleaner, которое может удалить старые журналы. Неплохая идея вызывать очиститель журнала из самой обложки cron, в конце.


Пример:

# 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

Журнал будет содержать это после запуска завернутого задания cron:

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

Ответ 2

Вставить

'date +%F'

к вашей команде cp, вот так:

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

поэтому он скопирует src_file в dst_file_2017-01-20

UPD:

Как заметил @tripleee, символ % должен быть экранирован в cron, поэтому ваша работа cron будет выглядеть так:

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