У меня есть ежечасный скрипт cron, который принимает некоторый вывод (дамп mysql), передает его через gzip и цели чтобы перезаписать файл с тем же именем. Когда я запускаю его вручную как 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
файлы.
Скрипт выглядит так (ничего особенного) и находится в коробке CentOS в /etc/cron.hourly
:
#!/bin/bash
DATE=`date +%H`
DIR="/abs/path/to/dir"
FILE="hourly-${DATE}.gz"
OPTS="..."
mysqldump $OPTS | gzip -9 > $DIR/$FILE
Может ли кто-нибудь посоветовать, почему эта простая операция не выполняется должным образом?
Скорее всего, ваш скрипт написан для использования функций Bash, но он запускается оболочкой Bourne. У вас есть #!/bin/bash
как первая строчка вашего скрипта? Пожалуйста, опубликуйте это, чтобы мы могли лучше вам помочь.
редактировать:
В сценариях, предназначенных для запуска в качестве заданий cron, я всегда указываю полный путь к программам (например, mysqldump
и gzip
), поскольку переменная $ PATH и такие вещи, как псевдонимы, будут отличаться от таковых в вашей интерактивной оболочке. Таким образом, результаты предсказуемы.
Попробуйте добавить эту строку в начало вашего скрипта после строки bash
set +C
Это отключит параметр noclobber в bash, поэтому файл следует перезаписать.
Если это не так, то, вероятно, это что-то вроде псевдонима для gzip, устанавливаемого cron или вашей средой в целом.
Попробуйте установить #!/bin/bash -x
и напишите / path / to / bash_script 1> / path / to / log_file (где в / path / ... установите свой собственный путь к файлам).
Мне это кажется странным, но в bash есть опция noclobber, благодаря которой перенаправление не перезаписывает файл. Может быть, это новая версия, похожая на новую, но вместо нее создается файл .1?
Возможно ли, что в задании cron вызывается что-то вроде logrotate или что-то запускается прямо перед этим, что перемещает файл (logrotate)? Вы должны проверить / etc / crontab и crontab -e
запустить как root.
Это на каком-то облачном или виртуальном хостинге? Возможно, провайдер создал что-то, что помогает снизить нагрузку на их билеты :-)
Это не gzip -c
? Этот вариант предназначен для записи в стандартный вывод, а не в файл. Есть ли GZIP
или GZIP_OPT
набор переменных окружения (с параметрами gzip в нем)?