我有一个每小时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
身份运行。
我试过了:
但都没有按预期工作,我只是得到.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(例如mysqldump
和gzip
),因为$ 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
? 该选项用于写入标准输出而不是文件。 是否有一个GZIP
或GZIP_OPT
环境variables集(在其中的gzip选项)?