Как заставить CRON звонить по правильным путям
Я пытаюсь заставить cron звонить в правильные пути. Когда я запускаю скрипт Python из оболочки, скрипт работает нормально, поскольку он использует пути, установленные в bashrc, но когда я использую cron, все пути не используются из bashrc. Есть ли файл, в который я могу ввести пути для cron, например bashrc, или способ вызова путей из bashrc?
Извините, я не думаю, что правильно сформулировал это, я могу запустить правильный скрипт (это означает, что путь к скрипту в crontab здесь не проблема), это просто когда этот скрипт работает, я запускаю сборку, и это использует пути, установленные в .bashrc
. Когда я запускаю скрипт, когда я вошел в систему,.bashrc
пути втягиваются. Так как cron не работает в оболочке за сказать, что он не тянет в .bashrc
. Есть ли способ вытащить это без необходимости писать обертку сценария bash?
15 ответов:
Я
/etc/crontab
. Я использовалvi
и ввел нужные мне пути в этот файл и запустил его как root. Обычный crontab перезаписывает пути, которые вы настроили. хороший учебник о том, как это сделать.общесистемный cron-файл выглядит так:
This has the username field, as used by /etc/crontab. # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file. # This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 42 6 * * * root run-parts --report /etc/cron.daily 47 6 * * 7 root run-parts --report /etc/cron.weekly 52 6 1 * * root run-parts --report /etc/cron.monthly 01 01 * * 1-5 root python /path/to/file.py
скорее всего, cron работает в очень разреженной среде. Проверьте переменные среды, которые использует cron, добавив фиктивное задание, которое сбрасывает
env
в такой файл:* * * * * env > env_dump.txt
сравните это с выходом
env
в обычном сеансе оболочки.вы можете добавить свои собственные переменные среды в локальную кронтаб, определив их в верхней части кронтаба.
вот быстрое исправление, чтобы добавить
$PATH
в текущем кронтаб:# echo PATH=$PATH > tmp.cron # echo >> tmp.cron # crontab -l >> tmp.cron # crontab tmp.cron
полученный crontab будет похож на ответ chrissygormley, с путем, определенным перед правилами crontab.
вы должны поставить полные пути в вашем
crontab
. Это самый безопасный вариант.
Если вы не хотите этого делать, вы можете поместить сценарий-оболочку вокруг своих программ и установить путь туда.например
01 01 * * * command
будет:
01 01 * * * /full/path/to/command
также все, что называется от
cron
следует быть очень осторожным в отношении программ, которые он запускает, и, вероятно, установить свой собственный выбор дляPATH
переменной.EDIT:
если вы не знаете, где команда заключается в том, что вы хотите выполнить
which <command>
из вашей оболочки, и он скажет вам путь.EDIT2:
поэтому, как только ваша программа запущена, первое, что она должна сделать, это установить
PATH
и любой другой необходимой переменной (напримерLD_LIBRARY_PATH
) к значениям, которые необходимы для запуска скрипта.
В основном вместо того, чтобы думать, как изменить среду cron, чтобы сделать ее более подходящей для вашей программы/скрипта-сделайте свой скрипт обрабатывать среду, которую он дал, путем установка соответствующего, когда он начинается.
сделать ваши переменные работают для вас, это позволит получить доступ t
определите свой путь в /etc / profile.d/*. sh
установка пути прямо перед командной строкой в моем crontab работала для меня:
* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
добавление определения пути в пользовательскую кронтаб с правильными значениями поможет... Я наполнил свой только:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
и этого достаточно, чтобы все мои скрипты работали... Включите любой пользовательский путь там, если вам нужно.
среда по умолчанию для заданий cron очень разрежена и может сильно отличаться от среды, в которой вы разрабатываете свои скрипты python. Для сценария, который может выполняться в cron, любая среда, от которой вы зависите, должна быть задана явно. В самом файле cron укажите полные пути к исполняемым файлам python и к вашим скриптам python.
на моем AIX cron поднимает его переменные среды из /etc / environment, игнорируя то, что установлено в .профиль.
Edit: я также проверил несколько ящиков Linux разных возрастов, и они, похоже, также имеют этот файл, поэтому это, вероятно, не специфично для AIX.
Я проверил это, используя предложение cron joemaller и проверяя вывод до и после редактирования переменной PATH в /etc/environment.
Я знаю, что это уже ответили, но я думал, что его будет полезно для некоторых. У меня была аналогичная проблема, которую я недавно решил (найти здесь) и вот основные шаги, которые я предпринял, чтобы ответить на этот вопрос:
убедитесь, что у вас есть переменные, необходимые в PYTHONPATH (найти здесь и здесь и для получения дополнительной информации здесь) внутри .профиль или. bash_profile для любой оболочки, в которой вы хотите протестировать свой скрипт, чтобы убедиться в этом завод.
отредактируйте crontab, чтобы включить каталоги, необходимые для запуска скрипта в задании cron (здесь и здесь)
a) обязательно включите корневой каталог в переменную PATH (.) как описано здесь (в основном, если вы запускаете исполняемый файл с помощью своей команды, он должен иметь возможность найти корень или каталог, в котором хранится исполняемый файл) и, вероятно, эти (/sbin:/bin:/usr/sbin:/usr/bin)
в вашем файле crontab, создайте cronjob, который изменит каталог на каталог, в котором вы успешно запустили скрипт раньше (т. е. Users/user/Documents/foo)
a) это будет выглядеть следующим образом:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
Если вы не хотите делать одни и те же изменения в разных местах, то примерно сделайте это:
* * * * * . /home/username/.bashrc && yourcommand all of your args
The . пространство, а затем путь к нему .bashrc и команда & & - это волшебство, чтобы внести изменения в вашу среду в запущенную оболочку bash. Кроме того, если вы действительно хотите, чтобы оболочка была bash, неплохо иметь строку в вашем crontab:
SHELL=/bin/bash
надеюсь, что это поможет кому-то!
@Тревино: ваш ответ помог мне решить мою проблему. Однако для новичка стараюсь дать пошаговый подход.
- получить текущую установку java через
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- это позволяет понять, что значение пути используется crontab в настоящее время. Запустите crontab и возьмите значение $PATH, используемое crontab.- теперь снова отредактируйте crontab, чтобы установить желаемый путь к Java bin: a)
crontab -e
; б)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(его пример пути); c) теперь ваша запланированная работа / скрипт, как*/10 * * * * sh runMyJob.sh &
; d) удалитьecho $PATH
от crontab как его не нужно сейчас.
установите необходимый путь в вашем cron
crontab -e
Изменить: Нажмите
i
PATH=/usr/local/bin:/usr/local/:or_whatever 10 * * * * your_command
сохранить и выйти
:wq
самый простой обходной путь, который я нашел, выглядит так:
* * * * * root su -l -c command
этот пример вызывает
su
как пользователь root и запускает оболочку с полной средой пользователя, включая $PATH, установленной так, как если бы они вошли в систему. Он работает одинаково на разных дистрибутивах, более надежен, чем источник .bashrc (который не работал для меня) и избегает жесткого кодирования конкретных путей, которые могут быть проблемой, если вы предоставляете пример или инструмент настройки и не знаете, какой дистрибутив или макет файла на система пользователя.вы также можете указать имя пользователя после
su
Если вы хотите другого пользователя, чем root, но вы, вероятно, должны оставить доsu
команда, так как это гарантируетsu
имеет достаточные права для переключения на любого указанного пользователя.
Если вы используете
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