Назад | Перейти на главную страницу

`outputscript | gzip> $ file` не перезаписывает $ file

У меня есть ежечасный скрипт 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 в нем)?