Как заставить 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