Правильный способ запустить скрипт с помощью cron?

StackOverflow https://stackoverflow.com/questions/819944

Вопрос

При запуске сценария с помощью 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).

С уважением

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top