`输出| | gzip> $ file`不能覆盖$文件

我有一个每小时cron脚本,它需要一些输出(一个mysql转储),通过gzippipe道,并打算覆盖相同名称的文件。 当我以root身份手动运行它时,文件被覆盖。 当它由cron守护进程运行时,文件名会附加“.1”。 这一直在发生,所以过了一段时间,我有这样的文件很多:

 myfile.gz myfile.gz.1 myfile.gz.1.1 myfile.gz.1.1.1 myfile.gz.1.1.1.1 

等等。

ps aux|grep crond显示守护进程正在以root身份运行。

我试过了:

  • 重命名原始文件,推送输出,然后在完成时删除旧文件
  • 在pipe道输出之前删除原始文件

但都没有按预期工作,我只是得到.1.1.1.1文件。

脚本看起来像这样(没什么特别的),位于/etc/cron.hourly的CentOS盒子里:

 #!/bin/bash DATE=`date +%H` DIR="/abs/path/to/dir" FILE="hourly-${DATE}.gz" OPTS="..." mysqldump $OPTS | gzip -9 > $DIR/$FILE 

任何人都可以build议,为什么这个简单的操作没有按预期运行?

最有可能的是,您的脚本被编写为使用Bashfunction,但它由Bourne shell运行。 你有#!/bin/bash作为脚本的第一行吗? 请张贴,所以我们可以更好地帮助你。

编辑

在作为cron作业运行的脚本中,我总是指定程序的完整path(例如mysqldumpgzip ),因为$ PATHvariables和别名等内容将与交互式shell中的不同。 这样,结果是可以预测的。

尝试将这一行添加到脚本之后的脚本的顶部

 set +C 

这将closuresbash中的noclobber选项,所以应该覆盖文件。

如果不是这样的话,那么它可能就像是由cron或者你的整个环境设置gzip的别名。

这似乎真的很奇怪,bash有一个noclobber选项,使得redirect不会覆盖文件。 也许这个最近的版本是一个类似的新选项,但创build一个.1文件呢?

是否有可能像cronjob调用logrotate,或者什么东西运行之前,它移动文件(logrotate)? 你应该检查/ etc / crontab和crontab -e以root身份运行。

这是在某种云或共享托pipe网站? 也许提供商已经创build了一些这样做来帮助减less票据负载:-)

尝试设置#!/bin/bash -x和nd write / path / to / bash_script 1> / path / to / log_file(其中in / path / …设置自己的文件path)。

这不是gzip -c ? 该选项用于写入标准输出而不是文件。 是否有一个GZIPGZIP_OPT环境variables集(在其中的gzip选项)?