Я пытаюсь заставить cron вызывать правильные PATH. Когда я запускаю скрипт Python из оболочки, скрипт работает нормально, так как он использует PATH, заданные в bashrc, но когда я использую cron, все PATH не используются из bashrc. Есть ли файл, в который я могу ввести PATH для cron, например bashrc, или способ вызвать PATH из bashrc?
Извините, я не думаю, что я сформулировал это правильно, я могу получить правильный сценарий для запуска (это означает, что путь к сценарию в crontab здесь не является проблемой), просто когда этот сценарий выполняется, я запускаю сборку, и здесь используется Пути установлены в .bashrc
. Когда я запускаю скрипт, когда я вхожу в систему, .bashrc
меняются пути PATH. Поскольку cron не запускается в оболочке, как говорится, он не втягивается .bashrc
. Есть ли способ вытащить это без написания оболочки сценария bash?
source /etc/profile
он должен есть.bashrc
и многое другое, что вам может не хватать. Явный поиск профилей становится очень полезным, если вы хотите, чтобы некоторые скрипты выполнялись «автономно», он также защищает от странных сред и так далее ...sh
скрипты, вызываемые crontab, работать. Вы можете подтвердить, что он обновляет путь, добавив задание, например,* * * * * echo $PATH > ~/crontab_path.txt
и проверив файл через минуту.Ответы:
Я использовал
/etc/crontab
. Я использовалvi
и ввел в этот файл нужные мне пути и запустил его как root. Обычный crontab перезаписывает заданные вами пути. Хороший учебник, как это сделать .Общесистемный файл cron выглядит так:
источник
/etc/crontab
доступны для cron при запуске с правами root в Ubuntu 14.04. (sudo crontab -e
)Скорее всего, cron работает в очень разреженной среде. Проверьте переменные среды, которые использует cron, добавив фиктивное задание, которое выводит данные
env
в такой файл:Сравните это с выводом
env
в обычном сеансе оболочки.Вы можете добавить свои собственные переменные среды в локальный crontab, определив их в верхней части вашего crontab.
Вот быстрое исправление, которое можно добавить
$PATH
к текущему crontab:Полученный crontab будет похож на ответ Криссигормли, с PATH, определенным до правил crontab.
источник
Вы должны поместить полные пути в свой
crontab
. Это самый безопасный вариант.Если вы не хотите этого делать, вы можете поместить вокруг своих программ сценарий-оболочку и указать там PATH.
например
будет выглядеть так:
Кроме того, все, из чего вызывается,
cron
должно быть очень осторожно с программами, которые оно запускает, и, вероятно, устанавливать свой собственный выбор дляPATH
переменной.РЕДАКТИРОВАТЬ:
Если вы не знаете, где находится команда, которую хотите выполнить
which <command>
из оболочки, она сообщит вам путь.EDIT2:
Итак, когда ваша программа запущена, первое, что она должна сделать, это установить
PATH
и любую другую необходимую переменную (напримерLD_LIBRARY_PATH
) на значения, которые требуются для запуска скрипта.По сути, вместо того, чтобы думать о том, как изменить среду cron, чтобы сделать ее более подходящей для вашей программы / скрипта, сделайте так, чтобы ваш скрипт обрабатывал заданную среду, установив соответствующую при запуске.
источник
crontab
.Установка PATH прямо перед командной строкой в моем crontab сработала для меня:
источник
Добавление определения PATH в пользовательский crontab с правильными значениями поможет ... Я заполнил свое:
И этого достаточно, чтобы все мои скрипты заработали ... Включите туда любой настраиваемый путь, если нужно.
источник
/etc/crontab
. Это самый простой ответ на уровне пользователя. Хорошая работа, @ Treviño. Проголосуйте за это, если согласны.Сделайте так, чтобы ваши переменные работали на вас, это позволит получить доступ к t
Определите ваш PATH в /etc/profile.d/*.sh
Общесистемные переменные среды
Файлы с расширением .sh в каталоге /etc/profile.d запускаются всякий раз, когда вводится оболочка входа в bash (например, при входе в систему с консоли или через ssh), а также с помощью DisplayManager при загрузке сеанса рабочего стола.
Например, вы можете создать файл /etc/profile.d/myenvvars.sh и установить такие переменные:
Запустите crontab с опцией входа!
CRONTAB запустить сценарий или команду с переменными среды
источник
проблема
Ваш сценарий работает, когда вы запускаете его с консоли, но не работает в cron.
причина
В вашем crontab нет правильных переменных пути (и, возможно, оболочки)
Решение
Добавьте текущую оболочку и перейдите к crontab
Скрипт, который сделает это за вас
Источник
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Пример вывода
источник
В моем AIX cron берет переменные окружения из / etc / environment, игнорируя то, что установлено в .profile.
Изменить: я также проверил пару ящиков Linux разного возраста, и они, похоже, тоже имеют этот файл, так что это, вероятно, не специфично для AIX.
Я проверил это с помощью предложения cron joemaller и проверки вывода до и после редактирования переменной PATH в / etc / environment.
источник
Если вы не хотите делать одни и те же правки в разных местах, сделайте примерно следующее:
Файл. пробел, а затем путь к .bashrc и команда && - это волшебство, позволяющее внести изменения вашей среды в работающую оболочку bash. Кроме того, если вы действительно хотите, чтобы оболочка была bash, неплохо было бы иметь строку в вашем crontab:
Надеюсь, это кому-то поможет!
источник
Среда по умолчанию для заданий cron очень разреженная и может сильно отличаться от среды, в которой вы разрабатываете свои сценарии python. Для сценария, который может запускаться в cron, любая среда, от которой вы зависите, должна быть установлена явно. В самом файле cron укажите полные пути к исполняемым файлам python и к вашим сценариям python.
источник
Я знаю, что на это уже был дан ответ, но я подумал, что он будет полезен некоторым. У меня была аналогичная проблема, которую я недавно решил ( нашел здесь ), и вот основные шаги, которые я предпринял, чтобы ответить на этот вопрос:
убедитесь, что у вас есть необходимые переменные в PYTHONPATH (можно найти здесь и здесь, а для получения дополнительной информации здесь) внутри .profile или .bash_profile для любой оболочки, в которой вы хотите протестировать свой скрипт, чтобы убедиться, что он работает.
отредактируйте свой crontab, включив в него каталоги, необходимые для запуска вашего скрипта в задании cron (можно найти здесь и здесь)
a) обязательно включите корневой каталог в переменную PATH (.), как описано здесь (в основном, если вы запускаете исполняемый файл с вашей командой, он должен иметь возможность найти корень или каталог, в котором хранится исполняемый файл) и, возможно, эти (/ SBIN: / бен: / USR / SBIN: / USR / BIN)
в вашем файле crontab создайте задание cron, которое изменит каталог на каталог, в котором вы успешно запускали сценарий ранее (например, Users / user / Documents / foo)
а) Это будет выглядеть так:
источник
@Trevino: ваш ответ помог мне решить мою проблему. Однако для новичка постараюсь дать пошаговый подход.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- это позволяет понять, какое значение PATH использует crontab в настоящее время. Запустите crontab и получите значение $ PATH, используемое crontab.crontab -e
; б)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(это примерный путь); c) теперь ваше запланированное задание / сценарий вроде*/10 * * * * sh runMyJob.sh &
: г) удалитьecho $PATH
из crontab, поскольку он сейчас не нужен.источник
Установите требуемый PATH в вашем cron
Изменить: Нажмите
i
Сохранить и выйти
:wq
источник
Самый простой способ обхода, который я нашел, выглядит так:
В этом примере вызывается
su
как пользователь root и запускается оболочка с полной средой пользователя, включая $ PATH, установленной так, как если бы они вошли в систему. Он работает одинаково в разных дистрибутивах, более надежен, чем поиск .bashrc (который не работал для me) и избегает жесткого кодирования конкретных путей, что может быть проблемой, если вы предоставляете пример или инструмент настройки и не знаете, какой дистрибутив или макет файла в системе пользователя.Вы также можете указать имя пользователя после,
su
если вам нужен другой пользователь, а не root, но вам, вероятно, следует оставитьroot
параметр передsu
командой, поскольку это гарантирует, что у васsu
есть достаточные привилегии для переключения на любого указанного вами пользователя.источник
Если вы используете,
webmin
то следующие шаги, как установитьPATH
значение:источник