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

Кто-нибудь может посоветовать, почему эта простая операция не выполняется должным образом?

5 ответов

Решение

Скорее всего, ваш скрипт написан с использованием функций 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?

Возможно ли, что-то вроде logrotate вызывается в cronjob, или что-то запускается прямо перед тем, как перемещать файл (logrotate)? Вы должны проверить /etc/crontab и crontab -e запустить от имени root.

Это на каком-то облачном или виртуальном хостинге? Возможно, провайдер создал что-то такое, что поможет уменьшить нагрузку на билеты:-)

Это не gzip -c? Эта опция предназначена для записи в стандартный вывод, а не в файл. Есть ли GZIP или же GZIP_OPT переменная окружения установлена ​​(с опциями gzip в ней)?

Другие вопросы по тегам