Сценарий оболочки и проблемы CRON
Я написал скрипт резервного копирования для нашего локального сервера разработки (работает под управлением Ubuntu server edition 9.10), просто простой скрипт для tar & gzip локального корня и вставления его в папку для резервных копий. Он отлично работает, когда я бегу:
$ bash backups.sh
но он не будет работать, когда я запускаю его через crontab.
59 23 * * * bash /home/vnc/backups/backup.sh >> /home/vnc/backups/backup.log 2> $1
Я получаю сообщение об ошибке
/bin/sh: cannot create : nonexistent
Сценарий помещает tar.gz в папку, из которой он запускается (/home/user1), но затем пытается скопировать его в смонтированный общий ресурс (/home/backups, который на самом деле 192.168.0.6/backups) с сетевого диска, используя fstab. Смонтированный общий ресурс имеет разрешения 777, но владелец и группа отличаются от тех, на которых выполняется сценарий. Я использую bash для запуска скрипта вместо sh, чтобы обойти другую проблему, которая у меня была в прошлом с ошибками "плохой замены"
Первые 2 строки файла
! /bin/bash
cd /home/vnc/backups
Я, вероятно, не предоставляю достаточно информации, чтобы полностью ответить на этот пост, но я могу разместить больше информации по мере необходимости, но я действительно не знаю, где искать дальше.
3 ответа
Подсказка в сообщении об ошибке:
/bin/sh: cannot create : nonexistent
Обратите внимание, что там написано "ш". Оболочка Bourne не поддерживает некоторые функции, характерные для Bash. Если вы используете функции Bash, вам нужно указать Bash запустить скрипт.
Сделайте первую строку вашего файла:
#!/bin/bash
или в вашей записи в crontab сделайте это:
* * * * * /bin/bash scriptname
Не видя вашу запись в crontab и ваш скрипт, трудно быть более конкретным.
В crontab просто измените 2>$1 на 2>&1. Я только что сделал один сам. Спасибо Деннис Уильямсон.
Возможно, первое, что вы должны сделать в своем backups.sh
это вставить cd /home/user1
, crond
может выполнить ваш сценарий из другого каталога, чем вы думаете, и принудительное использование одного и того же каталога независимо от того, как он выполняется, может быть хорошим первым запуском.
Еще один потенциально полезный шаг отладки - добавить id > /tmp/id.$$
или что-то в этом роде, так что вы можете точно определить, какая учетная запись пользователя и группы используются для запуска вашего скрипта.