Правильный способ запустить скрипт с помощью cron? - PullRequest
3 голосов
/ 04 мая 2009

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

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

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

Хорошо, заранее спасибо за помощь.

Ответы [ 4 ]

4 голосов
/ 04 мая 2009

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

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

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

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

3 голосов
/ 04 мая 2009

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

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

*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
3 голосов
/ 04 мая 2009

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

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

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

1 голос
/ 05 мая 2009

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

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

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

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

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

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

Привет

...