Как заставить CRON звонить в правильные PATH
Я пытаюсь заставить cron вызвать правильные PATH. Когда я запускаю Python script из оболочки, script работает отлично, поскольку использует PATH, установленные в bashrc, но когда я использую cron, все PATH не используются из bashrc. Есть ли файл, в который я могу ввести PATHs для cron, например bashrc, или способ вызова PATH из bashrc?
Извините, я не думаю, что правильно сформулировал это, я могу запустить корректный script (что означает, что PATH для script в crontab не проблема), это просто, когда этот script Я запускаю сборку, и это использует PATH, установленные в .bashrc
. Когда я запускаю script, когда я вошел в систему, в него втягиваются PATH. .bashrc
. Поскольку cron не запускается в оболочке, скажем, не тянет .bashrc
. Есть ли способ потянуть это без необходимости писать обертку bash script?
Ответы
Ответ 1
Я использовал /etc/crontab
. Я использовал vi
и входил в PATH, которые мне нужны в этот файл, и запускал его как root. Обычный crontab перезаписывает PATH, которые вы настроили. Хороший учебник о том, как это сделать.
Системный файл 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
Ответ 2
Скорее всего, cron работает в очень редкой среде. Проверьте переменные среды cron, используя добавление фиктивного задания, которое выгружает env
в файл следующим образом:
* * * * * env > env_dump.txt
Сравните это с выходом env
в обычном сеансе оболочки.
Вы можете добавить свои собственные переменные среды в локальный crontab, указав их в верхней части вашего crontab.
Здесь быстрое исправление для добавления $PATH
к текущему crontab:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Полученный crontab будет похож на ответ chrissygormley, с PATH, определенным перед правилами crontab.
Ответ 3
Вы должны поместить полные пути в свой crontab
. Это самый безопасный вариант.
Если вы не хотите этого делать, вы можете поместить обертку script вокруг своих программ и установить там PATH.
например.
01 01 * * * command
становится:
01 01 * * * /full/path/to/command
Также все, что вызвано из cron
, должно быть очень осторожным в отношении запущенных программ и, вероятно, установить свой собственный выбор для переменной PATH
.
EDIT:
Если вы не знаете, где команда, которую вы хотите выполнить which <command>
из вашей оболочки, и она сообщит вам путь.
EDIT2:
Итак, как только ваша программа будет запущена, первое, что он должен сделать, это установить PATH
и любую другую требуемую переменную (например, LD_LIBRARY_PATH
) для значений, необходимых для запуска script.
В основном вместо того, чтобы думать о том, как изменить среду cron, чтобы сделать ее более подходящей для вашей программы / script, сделайте ваш script обработанным средой, заданной соответствующим параметром, при запуске.
Ответ 4
Сделайте ваши переменные работающими для вас, это позволит получить доступ t
Определите свой PATH в файле /etc/profile.d/*. sh
Общесистемные переменные среды
Файлы с расширением .sh в каталоге /etc/profile.d выполняются всякий раз, когда вводится оболочка входа bash (например, при входе в систему из консоли или через ssh), а также с помощью DisplayManager, когда загрузки рабочего стола.
Вы можете, например, создать файл /etc/profile.d/myenvvars.sh и установить такие переменные:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin
Выполнить crontab с параметром login!
CRONTAB запустите script или команду с переменными окружения
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
Ответ 5
Установка PATH прямо перед командной строкой в моем crontab работала для меня:
* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
Ответ 6
Проблема
Ваш script работает, когда вы запускаете его с консоли, но не работает в cron.
Причина
Ваш crontab не имеет правильных переменных пути (и, возможно, оболочки)
Решение
Добавьте текущую оболочку и путь к crontab
Script, чтобы сделать это для вас
#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }
#whenver the script exits call the function "finish"
trap finish EXIT
########################################
# pretty printing functions
function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; }
function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; }
function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; }
function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; }
function printline {
hr=-------------------------------------------------------------------------------------------------------------------------------
printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }
####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
crontab -l &> /dev/null
[ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}
####################################
# Add current shell and path to user crontab
function add_shell_path_to_crontab {
#print info about what being added
print_notification "Current SHELL: ${SHELL}"
print_notification "Current PATH: ${PATH}"
#Add current shell and path to crontab
print_status "Adding current SHELL and PATH to crontab \nold crontab:"
printline; crontab -l; printline
#keep old comments but start new crontab file
crontab -l | grep "^#" > tmp.cron
#Add our current shell and path to the new crontab file
echo -e "SHELL=${SHELL}\nPATH=${PATH}\n" >> tmp.cron
#Add old crontab entries but ignore comments or any shell or path statements
crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron
#load up the new crontab we just created
crontab tmp.cron
#Display new crontab
print_good "New crontab:"
printline; crontab -l; printline
}
require_gt1_user_crontab_job
add_shell_path_to_crontab
Источник
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Образец вывода
![add_curent_shell_and_path_to_crontab.sh example output]()
Ответ 7
Добавление определения PATH в пользовательский crontab с правильными значениями поможет...
Я наполнил меня просто:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
И это достаточно, чтобы все мои скрипты работали... Включите любой настраиваемый путь там, если вам нужно.
Ответ 8
Стандартная среда для заданий cron очень разрежена и может сильно отличаться от среды, в которой вы разрабатываете скрипты python. Для script, который может быть запущен в cron, любая среда, на которую вы зависите, должна быть явно задана. В самом файле cron включите полные пути к исполняемым файлам python и вашим сценариям python.
Ответ 9
На моем AIX cron выберет переменные среды из /etc/environment, игнорируя то, что установлено в .profile.
Изменить: я также проверил несколько ящиков Linux разных возрастов, и они, похоже, тоже имеют этот файл, поэтому это скорее всего не AIX.
Я проверил это с помощью предложения joemaller cron и проверил вывод до и после редактирования переменной PATH в/etc/environment.
Ответ 10
Я знаю, что уже был дан ответ, но я думал, что он будет полезен для некоторых. У меня была аналогичная проблема, которую я недавно решил (здесь), и вот основные моменты шагов, которые я предпринял, чтобы ответить на этот вопрос:
-
убедитесь, что у вас есть переменные, которые вам нужны в PYTHONPATH (здесь и здесь и для получения дополнительной информации здесь) внутри .profile или .bash_profile для любой оболочки, которую вы хотите протестировать для своего script, чтобы убедиться он работает.
-
отредактируйте свой crontab, чтобы включить каталоги, необходимые для запуска script в задании cron (найдено здесь и здесь).
a) обязательно включите корневой каталог в переменную PATH (.), как описано здесь (в основном, если вы выполняете исполняемый файл с помощью своей команды, он должен иметь возможность находить корень или каталог, в котором хранится исполняемый файл) и, вероятно, они (/sbin:/bin:/usr/sbin:/usr/bin)
-
в вашем файле crontab, создайте cronjob, который изменит каталог в каталог, в котором вы успешно запускали script раньше (например, пользователи/пользователь/документы/foo)
a) Это будет выглядеть следующим образом:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
Ответ 11
Если вы не хотите делать одни и те же изменения в разных местах, выполните примерно следующее:
* * * * * . /home/username/.bashrc && yourcommand all of your args
. а затем путь к .bashrc и && команда - это волшебство, позволяющее изменить вашу среду в рабочей оболочке bash. Тоже, если вы действительно хотите, чтобы оболочка была bash, неплохо иметь строку в вашем crontab:
SHELL=/bin/bash
Надеюсь, это поможет кому-то!
Ответ 12
@Trevino: ваш ответ помог мне решить мою проблему. Однако для новичка, пытающегося дать пошаговый подход.
- Получить текущую установку java через
$ echo $JAVA_HOME
-
$ crontab -e
-
* * * * * echo $PATH
- это позволяет понять, что значение PATH используется crontab в настоящее время. Запустите crontab и возьмите $PATH значение, используемое crontab.
- Теперь отредактируйте crontab еще раз, чтобы установить желаемый путь в java bin: a)
crontab -e
; b) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(его путь выборки); c) теперь ваше запланированное задание /script как */10 * * * * sh runMyJob.sh &
; d) удалите echo $PATH
из crontab, поскольку он не нужен сейчас.
Ответ 13
Простейшее обходное решение, которое я нашел, выглядит следующим образом:
* * * * * root su -l -c command
Этот пример вызывает su
качестве пользователя root и запускает оболочку с полной пользовательской средой, включая $ PATH, как если бы они вошли в систему. Он работает одинаково на разных дистрибутивах, более надежен, чем поиск.bashrc (который не работал для меня) и избегает жесткого кодирования конкретных путей, которые могут быть проблемой, если вы предоставляете пример или инструмент установки и не знаете, какой дистрибутив или макет файла в пользовательской системе.
Вы также можете указать имя пользователя после su
если вы хотите, чтобы другой пользователь был не root, но вы, вероятно, должны оставить параметр root
перед командой su
поскольку это гарантирует, что su
имеет достаточные привилегии для переключения на любого пользователя, которого вы указываете.
Ответ 14
Установите требуемый PATH в вашем cron
crontab -e
Изменение: нажмите i
PATH=/usr/local/bin:/usr/local/:or_whatever
10 * * * * your_command
Сохранить и выйти :wq
Ответ 15
Если вы используете 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