Jak sprawić, by CRON wywołał prawidłowe ścieżki

Próbuję zmusić crona, aby zadzwonił we właściwych ścieżkach. Gdy uruchamiam skrypt Pythona z powłoki, skrypt działa poprawnie, ponieważ używa ścieżek ustawionych w bashrc, ale gdy używam crona, wszystkie ścieżki nie są używane z bashrc. Czy istnieje plik, do którego mogę wprowadzić ścieżki dla crona, na przykład bashrc lub sposób wywołania ścieżek z bashrc?

Sorry chyba źle to sformułowałem, mogę uruchomić poprawny skrypt (czyli ścieżka do skryptu w crontabie nie jest tu problemem), to tylko wtedy, gdy ten skrypt jest uruchomiony uruchamiam build i używa ścieżek ustawionych w .bashrc. Gdy uruchamiam skrypt po zalogowaniu, ścieżki .bashrc są ściągane. Ponieważ cron nie działa w powłoce per say nie ściąga .bashrc. Czy istnieje sposób na wyciągnięcie tego bez konieczności pisania wrappera skryptu bash?

Author: Chris Martin, 2010-03-05

15 answers

Użyłem /etc/crontab. Użyłem vi i wprowadziłem ścieżki potrzebne do tego pliku i uruchomiłem go jako root. Normalna tabela crontab nadpisuje ustawione ścieżki. dobry tutorial Jak to zrobić .

Systemowy plik cron wygląda następująco:

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
 135
Author: chrissygormley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-24 18:44:45

Najprawdopodobniej cron działa w bardzo rzadkim środowisku. Sprawdź zmienne środowiskowe, których używa cron, dodając atrapy zadania, które zrzeka env do pliku takiego jak:

* * * * * env > env_dump.txt

Porównaj to z wyjściem env w normalnej sesji powłoki.

Możesz dodać własne zmienne środowiskowe do lokalnej tabeli crontab, definiując je u góry tabeli.

Oto szybka poprawka, aby dodać $PATH do bieżącej tabeli crontab:

# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron

Powstały plik crontab będzie wygląda podobnie do odpowiedzi chrissygormleya, ze ścieżką zdefiniowaną przed regułami crontab.

 43
Author: joemaller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 00:56:14

Powinieneś umieścić pełne ścieżki w swoim crontab. To najbezpieczniejsza opcja.
Jeśli nie chcesz tego robić, możesz umieścić skrypt owijania wokół swoich programów i ustawić tam ścieżkę.

Np.

01 01 * * * command

Staje się:

01 01 * * * /full/path/to/command

Również wszystko, co wywołane z cron powinno być bardzo ostrożne z programami, które uruchamia, i prawdopodobnie ustawić swój własny wybór dla zmiennej PATH.

EDIT:

Jeśli nie wiesz gdzie jest polecenie, które chcesz wykonać which <command> z twojego shell i pokaże Ci drogę.

EDIT2:

Więc gdy twój program jest uruchomiony, pierwszą rzeczą, którą powinien zrobić, to ustawić PATH i każdą inną wymaganą zmienną (np. LD_LIBRARY_PATH) na wartości, które są wymagane do uruchomienia skryptu.
Zasadniczo zamiast zastanawiać się, jak zmodyfikować środowisko cron, aby było bardziej odpowiednie dla Twojego programu/skryptu - spraw, aby twój skrypt obsługiwał środowisko, które zostało mu podane, ustawiając odpowiednie środowisko podczas jego uruchamiania.

 20
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 17:10:38

Spraw, aby Twoje zmienne działały za Ciebie, to pozwoli na dostęp t

Zdefiniuj swoją ścieżkę w /etc/profile.D/*. Sh

Systemowe zmienne środowiskowe

Pliki z rozszerzeniem. SH w /etc/profile.katalog D jest uruchamiany za każdym razem, gdy zostanie wprowadzona powłoka logowania bash (np. podczas logowania z konsoli lub przez ssh), a także przez Menedżera DisplayManager podczas ładowania sesji pulpitu.

Można na przykład utworzyć plik /etc/profile.d/myenvvars.sh i ustaw zmienne w ten sposób:

export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin

Uruchom crontab z opcją logowania!

Crontab uruchom skrypt lub polecenie ze zmiennymi środowiskowymi

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
 13
Author: Artistan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 11:37:14

Ustawienie ścieżki tuż przed wierszem poleceń w crontabie zadziałało dla mnie:

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
 13
Author: myrho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 11:01:23

Problem

Twój skrypt działa, gdy uruchamiasz go z konsoli, ale nie działa w cron.

Cause

Twoja crontab nie ma odpowiednich zmiennych ścieżki (i prawdopodobnie powłoki)

Rozwiązanie

Dodaj aktualną powłokę i ścieżkę do pliku crontab

Skrypt do robienia tego za ciebie

#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user's 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's crontab
function add_shell_path_to_crontab {
    #print info about what's 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

Źródło

Https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

Próbka Output

add_curent_shell_and_path_to_crontab.sh Przykładowe wyjście

 9
Author: brakertech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 15:39:06

Dodanie definicji ścieżki do pliku crontab użytkownika z poprawnymi wartościami pomoże... Ja swoje wypełniłem po prostu:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

I to wystarczy, aby wszystkie moje Skrypty działały... W razie potrzeby Dołącz dowolną ścieżkę niestandardową.

 8
Author: Treviño,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-30 15:53:51

Domyślne środowisko dla zadań cron jest bardzo rzadkie i może bardzo różnić się od środowiska, w którym tworzysz Skrypty Pythona. W przypadku skryptu, który może być uruchamiany w cron, każde środowisko, od którego zależy, powinno być ustawione jawnie. W samym pliku cron Dołącz pełne ścieżki do plików wykonywalnych Pythona i do skryptów Pythona.

 2
Author: mob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 16:12:07

Na moim Aix cron pobiera zmienne środowiskowe z /etc / environment ignorując to, co jest ustawione w.profil.

Edit: sprawdziłem też kilka skrzynek Linuksowych w różnym wieku i te wydają się mieć również ten plik, więc prawdopodobnie nie jest to specyficzne dla AIX.

Sprawdziłem to za pomocą sugestii crona joemallera i sprawdzałem wyjście przed i po edycji zmiennej PATH w/etc / environment.

 2
Author: Van Amburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-18 20:02:34

Wiem, że już na to odpowiedziałam, ale pomyślałem, że jego będzie przydatny dla niektórych. Miałem podobny problem, który niedawno rozwiązałem (znalazłem tutaj ) i oto najważniejsze kroki, które podjąłem, aby odpowiedzieć na to pytanie:

  1. Upewnij się, że masz zmienne potrzebne w PYTHONPATH (znaleźć tutaj i tutaj i więcej informacji tutaj) wewnątrz .profil lub .bash_profile dla każdej powłoki, w której chcesz przetestować skrypt, aby upewnić się, że działa.

  2. Edytuj crontab zawiera katalogi potrzebne do uruchomienia skryptu w zadaniu cron (znalezione tutaj i tutaj)

    A) Upewnij się, że katalog główny znajduje się w zmiennej PATH (.) jak wyjaśniono tutaj (zasadniczo jeśli uruchamiasz program wykonywalny za pomocą polecenia, musi on być w stanie znaleźć roota lub katalog, w którym plik wykonywalny jest przechowywany) i prawdopodobnie te (/sbin:/bin:/usr/sbin:/usr/bin)

  3. W pliku crontab Utwórz zadanie cron, które zmieni katalog na katalog gdzie wcześniej pomyślnie uruchomiłeś skrypt (np. Users/user/Documents/foo)

    A) będzie to wyglądało następująco:

    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
 2
Author: derigible,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Jeśli nie chcesz robić tych samych edycji w różnych miejscach, z grubsza zrób to:

* * * * * . /home/username/.bashrc && yourcommand all of your args

The . miejsce, a następnie drogę do .bashrc i polecenie & & są magiczne, aby zmienić środowisko w uruchomionej powłoce bash. Również, jeśli naprawdę chcesz, aby powłoka była bash, dobrym pomysłem jest posiadanie linii w crontabie:

SHELL=/bin/bash
Mam nadzieję, że to komuś pomoże!
 1
Author: Wade Chandler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 16:41:45

@Trevino: Twoja odpowiedź pomogła mi rozwiązać mój problem. Jednak dla początkujących, starając się dać krok po kroku podejście.

  1. pobierz aktualną instalację Javy za pomocą $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH - to pozwala zrozumieć, jaka wartość ścieżki jest obecnie używana przez crontab. Uruchom plik crontab i pobierz wartość $PATH używaną przez plik crontab.
  4. Teraz ponownie edytuj crontab, aby ustawić żądaną ścieżkę bin Javy: a) crontab -e; b) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin (jest to przykładowa ścieżka); c) teraz zaplanowana zadanie / skrypt jak */10 * * * * sh runMyJob.sh &; d) Usuń echo $PATH z crontab, ponieważ nie jest teraz potrzebny.
 1
Author: Ram Dwivedi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-21 09:16:42

Ustaw wymaganą ścieżkę w cronie

crontab -e

Edit: Press i

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

10 * * * * your_command

Zapisz i zakończ :wq

 0
Author: shiva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 19:46:28

Najprostsze obejście, jakie znalazłem, wygląda tak:

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

Ten przykład wywołuje su jako użytkownika root i uruchamia powłokę z pełnym środowiskiem użytkownika, w tym $PATH, ustawionym tak, jakby był zalogowany. Działa tak samo na różnych dystrybucjach, jest bardziej niezawodny niż sourcing .bashrc (który nie działał dla mnie) i unika twardego kodowania konkretnych ścieżek, co może być problemem, jeśli podajesz przykład lub narzędzie instalacyjne i nie wiesz, co distro lub układ plików na użytkownika system.

Możesz również podać nazwę użytkownika po su, jeśli chcesz mieć innego użytkownika niż root, ale prawdopodobnie powinieneś zostawić parametr root przed poleceniem su, ponieważ zapewnia to su wystarczające uprawnienia, aby przełączyć się na dowolnego użytkownika, którego podasz.

 0
Author: tasket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 18:37:57

Jeśli użyjesz webmin, to są to kroki, jak ustawić wartość 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
 -2
Author: Al Bundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-18 10:51:19