Как заставить CRON звонить в правильные пути - PullRequest
109 голосов
/ 05 марта 2010

Я пытаюсь заставить cron вызывать правильные PATH.Когда я запускаю скрипт Python из оболочки, он работает нормально, так как он использует PATH, установленные в bashrc, но когда я использую cron, все PATH не используются из bashrc.Есть ли файл, в который я могу ввести PATH для cron, например bashrc, или способ вызова PATH из bashrc?

Извините, я не думаю, что сформулировал это правильно, я могу запустить правильный скрипт (это означает, что путь PATH к сценарию в crontab не является проблемой), просто когда этот сценарий запущен, я запускаю сборку, которая использует значения PATH, установленные в .bashrc.Когда я запускаю скрипт, когда я вхожу в систему, .bashrc PATH извлекаются. Так как cron не запускается в оболочке, скажем, он не извлекает .bashrc.Есть ли способ сделать это без написания оболочки-сценария bash?

Ответы [ 15 ]

2 голосов
/ 05 марта 2010

Среда по умолчанию для заданий cron очень скудна и может сильно отличаться от среды, в которой вы разрабатываете свои сценарии python. Для сценария, который может выполняться в cron, любая среда, от которой вы зависите, должна быть установлена ​​явно. В самом файле cron укажите полные пути к исполняемым файлам python и вашим сценариям python.

1 голос
/ 14 сентября 2018

Самый простой обходной путь, который я нашел, выглядит следующим образом:

* * * * * root su -l -c command

В этом примере su вызывается от имени пользователя root и запускает оболочку с полной средой пользователя, включая $ PATH, установленной так, как будто онивошли в систему. Он работает одинаково на разных дистрибутивах, более надежен, чем Sourcing .bashrc (который не работал для меня), и позволяет избежать жесткого кодирования определенных путей, что может быть проблемой, если вы предоставляете пример или инструмент настройки, а donВы не знаете, какой дистрибутив или расположение файлов в системе пользователя.

Вы также можете указать имя пользователя после su, если хотите, чтобы пользователь отличался от пользователя root, но вам, вероятно, следует оставить параметр root до *Команда 1009 *, поскольку это обеспечивает su достаточные привилегии для переключения на любого пользователя, которого вы укажете.

1 голос
/ 21 июня 2017

@ Тревино: ваш ответ помог мне решить мою проблему.Однако для новичка стараюсь дать пошаговый подход.

  1. Получите текущую версию Java через $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH - это позволяет понять, какое значение PATH используется crontabв настоящий момент.Запустите crontab и возьмите значение $ PATH, используемое crontab.
  4. Теперь отредактируйте crontab еще раз, чтобы задать желаемый путь к корзине Java: a) crontab -e;б) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin (это образец пути);в) теперь ваша запланированная работа / сценарий, как */10 * * * * sh runMyJob.sh &;d) удалите echo $PATH из crontab, так как он больше не нужен.
0 голосов
/ 02 января 2018

Установите необходимый путь в вашем кроне

crontab -e

Редактировать: Нажмите i

PATH=/usr/local/bin:/usr/local/:or_whatever

10 * * * * your_command

Сохранить и выйти :wq

0 голосов
/ 11 октября 2017

Если вы используете webmin, то вот шаги для установки значения PATH:

System
  -> Scheduled Cron Jobs
       -> Create a new environment variable
            -> For user: <Select the user name>
            -> Variable name: PATH
            -> Value: /usr/bin:/bin:<your personal path>
            -> Add environment variable: Before all Cron jobs for user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...