管理由cron作业创建的日志文件

时间:2017-01-20 03:09:58

标签: linux bash unix logging cron

我有一个cron作业,每天将其日志文件复制到我的主文件夹。

它每天都会覆盖目标文件夹中的现有文件,这是预期的。我想保留以前日期的日志,以便下次将文件复制到目标文件夹时,它会保留以前日期的文件。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

管理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=[$*]"
"$@"
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

答案 1 :(得分:1)

插入

`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`