Сценарий: у нас есть устаревшая система под управлением FreeBSD 4.7 (пожалуйста, не смейтесь. В конце года она будет выведена из эксплуатации. Мне просто нужно сохранить ее работоспособность и сделать резервную копию до тех пор), и у меня есть несколько сценариев дампа базы данных, которые я запускаю ежедневно с заданием cron. Я начинаю сценарий с #! / Usr / local / bin / bash. Сценарий использует команду date, чтобы указать дату как часть имени файла дампа. Когда я запускаю скрипт вручную, он работает должным образом. Однако, когда я помещаю его в cron, он терпит неудачу. Я проверил свой журнал ошибок, и он не работает в той части сценария, где я использую обратные кавычки и команду даты для имени файла (я также пробовал $ (date ...) в имени файла, и это дало ту же ошибку. затем попытался добавить / usr / local / bin / bash /path/to/script.sh в задание cron, и у него все еще была та же ошибка.
Поэтому я предполагаю, что он не переключается на оболочку bash при запуске. Сначала я подумал о добавлении echo $ SHELL в свой сценарий, чтобы увидеть его, но обнаружил, что переключение оболочек на самом деле не меняет значение переменной SHELL.
У кого-нибудь была подобная проблема с FreeBSD? Или кто-нибудь знает альтернативный способ проверить, какую оболочку он использует при выполнении? (Я также пробовал ps >> test.txt, и в cron это тоже не сработало).
Когда я читал это, мне приходило в голову несколько вещей.
Если вы запускаете bash, значение $ BASH должно расширяться до полного пути и имени файла исполняемого файла bash.
Как вы называете дату в своем сценарии. Вы вызываете это с полным именем пути или как "дата". Последний случай может привести к использованию функции, псевдонимов или чего-то еще, что окажется первым в пути, а не программы даты, которую вы ожидаете.
В некоторых случаях Bash будет вести себя по-разному в зависимости от среды. Вы можете сделать дамп среды в файл из сценария и посмотреть, как он запускается из командной строки и из cron. Вы можете обнаружить, что PATH отличается или что какая-то другая переменная среды установлена по-другому. Вы должны иметь возможность сбросить это в файл в / tmp, поместив в скрипт строку типа «env> /tmp/environment.$$». Каждый раз, когда сценарий запускается, он распечатывает среду в файл с именем environment. (Pid of script)
Вы также можете установить оболочку для всего crontab на любую оболочку, которую хотите, используя «SHELL = / path / to / new / shell» в отдельной строке.
По крайней мере, некоторые версии cron интерпретируют "%" как специальный символ. Я не могу сказать из вашего ответа выше, используете ли вы эту команду даты в самом crontab. Проконсультируйтесь со своей страницей руководства. Это
man 5 crontab
Другая страница руководства crontab предназначена для команды crontab, а не для формата файла.
на linux, но на bsd я не уверен.
Если это так, вы можете исправить это, экранировав% с помощью \ перед ним.
Попробуйте явно установить переменные среды (например, PATH
) или явно получать файлы запуска (например, /etc/profile
или /home/root/.profile
или что-то еще).
Если ваш cron
предполагает другую оболочку, вы можете захотеть exec
сценарий bash.