2009-05-04 6 views
3

При запуске скрипта с cron любой исполняемый файл, вызываемый внутри, должен иметь полный путь. Я обнаружил это, пытаясь запустить wondershaper, когда появилось много ошибок при попытке вызвать tc. Итак, мой вопрос: какой способ преодолеть эту проблему?Правильный способ запуска скрипта с помощью cron?

Возможных решения:

  • кд к исполняемой папке и подготовить символические ссылки на любой другой называются исполняемыми там (не уверен, если он работает - низкая портативность)
  • использовать полные пути в скрипте (это работает - низкая переносимость между различными дистрибутивами)
  • экспортирует переменную пути необходимых путей в скрипте (не уверен, если он работает)

Ну, спасибо заранее для тех, кто помогает.

+0

Является ли "личинка" вы имеете в виду здесь загрузчик? – dmckee

+0

lol, я имел в виду cron весь путь: $ – Doppelganger

+0

А ... это имеет смысл. – dmckee

ответ

3

Объявление переменных внутри вашего задания cron более ясное и удобное в обслуживании: все, что вам нужно изменить, содержится в вашем задании cron, и вам не нужно передавать несколько файлов если вы переместите его в другую систему.

PATH=/usr/bin:/your/fancy/dir 
MYAPPROOT=/var/lib/myapp 

*/2 * * * * myappinpath 
*/3 * * * * $MYAPPROOT/mylocalapp 
+1

Просто быстрый комментарий: не 0-59/2 так же, как */2? – Powerlord

+0

Да ты прав, отредактировал :) –

4

Если вы используете linux/bsd/mac, вы можете установить некоторые переменные окружения, такие как PATH, прямо в crontab, и с этим вы, как правило, хорошо.

Если вы на Solaris, я молюсь за вас. Но, у меня есть ответ тоже: я вообще источник .profile перед запуском ничего:

0 0 * * 0 . /home/myuser/.profile && cd /path && ./script 

Имейте в виду, мои .profile.bash_profile нагрузки и .bashrc. Просто убедитесь, что у любого файла, который вы используете, есть то, что вам нужно.

3

Поскольку cron не запускает login, .profile и/etc/profile не используются. Поэтому PATH не может быть настроен на ожидаемое значение. Я бы либо

  • набор и экспорт PATH соответствующего значения
  • использовать полные пути в скрипте

Ваш трюк с симлинками предполагающим. находится в PATH и просто не выглядит приятным

1

Моя рекомендация:

Установите все переменные в внешнем файле. Я использую файл process_name.env, расположенный в/etc/process_name или аналогичный. Представьте, что у вас есть сценарий резервного копирования. Затем вы:

  • Создайте /etc/backup.env и поместите все переменные среды, необходимые для выполнения задачи резервного копирования.
  • Измените сценарий резервного копирования и добавьте эту строку после Shebang:

    . /etc/backup.env # Существует точка и пробел перед полным доступом к среде резервного копирования.

IMO этот подход лучше, чем объявление переменных в определениях CRON, потому что:

  • Простота в обслуживании. Просто отредактируйте файл.
  • Простота переключение конфигурации/централизованную конфигурация:
    • Вы можете иметь несколько .env для использования вашего скрипта в различных ситуациях (например, считает, что имеются резервные места на вашем .env, вы можете передать .env местоположение, аргумент и запустить ежедневное задание cron, предоставляя .env с несколькими местами и еженедельно с разными местоположениями, предоставляя другой .env, просто пример).
  • Вы можете хранить файлы .env в VCS, например SVN или Git.
  • Очень легко проверить свои сценарии (нет необходимости выполнять его из CRON).

С уважением