Правильный способ запустить скрипт с помощью cron?
Вопрос
При запуске сценария с помощью cron любой исполняемый файл, вызываемый внутри, должен иметь полный путь.Я обнаружил это, пытаясь запустить чудотворец, когда при попытке вызова tc появилось много ошибок.Итак, мой вопрос: как правильно решить эту проблему?
Возможные решения:
- перейдите в папку исполняемого файла и подготовьте там символические ссылки на любой другой исполняемый файл (не уверен, работает ли он - низкая переносимость)
- используйте полные пути в скрипте (это работает - низкая переносимость между разными дистрибутивами)
- экспорт переменной пути с необходимыми путями внутри скрипта (не уверен, работает ли это)
Что ж, заранее спасибо всем, кто поможет.
Решение
Объявление переменных внутри вашего задания cron является более явным и простым в обслуживании:все, что вам нужно изменить, содержится в вашем задании cron, и вам не нужно переносить несколько файлов, если вы переместите их в другую систему.
PATH=/usr/bin:/your/fancy/dir
MYAPPROOT=/var/lib/myapp
*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
Другие советы
Если вы используете Linux/bsd/mac, вы можете установить некоторые переменные среды, например PATH
прямо в crontab
, и с этим, как правило, все в порядке.
Если вы используете Солярис, я молюсь за вас.Но у меня тоже есть ответ:Я обычно источник .profile
прежде чем запускать что-либо:
0 0 * * 0 . /home/myuser/.profile && cd /path && ./script
Имей в виду, мой .profile
нагрузки .bash_profile
и .bashrc
.Просто убедитесь, что в исходном файле есть то, что вам нужно.
Поскольку cron не запускает вход в систему, файлы .profile и /etc/profile не используются.Поэтому для PATH может быть установлено не то значение, которое вы ожидаете.я бы либо
- установите и экспортируйте PATH в соответствующее значение
- используйте полные пути в скрипте
Ваш трюк с символическими ссылками предполагает .находится в PATH и выглядит некрасиво
Моя рекомендация:
Установите все переменные во внешний файл.Я использую файл «имя_процесса.env», расположенный в /etc/имя_процесса или аналогичный.Представьте, что у вас есть сценарий резервного копирования.Затем вы:
- Создайте /etc/backup.env и поместите все переменные среды, необходимые для выполнения задачи «резервного копирования».
Измените сценарий резервного копирования и добавьте эту строку после Шебанг:
./etc/backup.env #Перед полным путем к среде резервного копирования стоит точка и пробел.
ИМО, этот подход лучше, чем объявление переменных в определениях CRON, потому что:
- Простота обслуживания.Просто отредактируйте файл.
- Легко переключаемая конфигурация/централизованная конфигурация:
- Вы можете иметь несколько .env для использования вашего сценария в разных ситуациях (например, предположим, что у вас есть резервные хранилища в вашем .env, вы можете передать местоположение .env в качестве аргумента и ежедневно запускать задание cron, предоставляя .env с несколькими местоположениями и еженедельно в разных местах, предоставив еще один .env, просто пример).
- Вы можете хранить файлы .env в системе контроля версий, например SVN или Git.
- Очень легко тестировать ваши скрипты (нет необходимости запускать их из CRON).
С уважением