`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 в ней)?