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?
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
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.
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.
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
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
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
Próbka Output
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ą.
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.
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.
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:
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.
-
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)
-
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
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!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.
- pobierz aktualną instalację Javy za pomocą
$ echo $JAVA_HOME
$ crontab -e
-
* * * * * 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. - 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.
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
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.
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
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