Próbuję zmusić crona do wywołania prawidłowych PATH. Kiedy uruchamiam skrypt Pythona z powłoki, skrypt działa dobrze, ponieważ używa PATH ustawionych w bashrc, ale kiedy używam crona, wszystkie PATH nie są używane z bashrc. Czy istnieje plik, do którego mogę wprowadzić PATH dla crona, taki jak bashrc lub sposób na wywołanie PATH z bashrc?
Przepraszam, nie wydaje mi się, żebym to poprawnie sformułował, mogę uruchomić poprawny skrypt do uruchomienia (co oznacza, że PATH do skryptu w crontab nie jest tutaj problemem), tylko wtedy, gdy ten skrypt jest uruchomiony, uruchamiam kompilację i używa PATHs ustawione .bashrc
. Kiedy uruchamiam skrypt, gdy jestem zalogowany, .bashrc
PATH są pobierane. Ponieważ cron nie działa w powłoce, powiedzmy, nie pobiera .bashrc
. Czy istnieje sposób, aby to zrobić bez konieczności pisania opakowania skryptu bash?
source /etc/profile
, że powinien jeść.bashrc
i wiele innych potencjalnie brakujących rzeczy. Jawne pozyskiwanie profili staje się całkiem przydatne, jeśli chcesz, aby niektóre skrypty działały „samodzielnie”, chronią również przed dziwnymi środowiskami, a więc ...sh
skrypty wywoływane przez crontab działają. Możesz potwierdzić, że aktualizuje ścieżkę, dodając zadanie* * * * * echo $PATH > ~/crontab_path.txt
i sprawdzając plik po minucie.Odpowiedzi:
Użyłem
/etc/crontab
. Użyłemvi
i wprowadziłem PATH, których potrzebowałem, do tego pliku i uruchomiłem go jako root. Normalny plik crontab nadpisuje skonfigurowane przez ciebie PATH. Dobry poradnik, jak to zrobić .Ogólnosystemowy plik cron wygląda następująco:
źródło
/etc/crontab
są dostępne dla crona, gdy działa jako root w Ubuntu 14.04. (sudo crontab -e
)Najprawdopodobniej cron działa w bardzo rzadkim środowisku. Sprawdź zmienne środowiskowe, których używa cron, dołączając fikcyjne zadanie, które zrzuca
env
do pliku takiego jak ten:Porównaj to z danymi wyjściowymi
env
w normalnej sesji powłoki.Możesz dołączyć własne zmienne środowiskowe do lokalnej tabeli crontab, definiując je na górze swojej tabeli crontab.
Oto szybka poprawka do dodania
$PATH
przed bieżącą tabelą crontab:Wynikowy plik crontab będzie wyglądał podobnie do odpowiedzi chrissygormley, z PATH zdefiniowaną przed regułami tabeli crontab.
źródło
Powinieneś umieścić pełne ścieżki w swoim
crontab
. To najbezpieczniejsza opcja.Jeśli nie chcesz tego robić, możesz umieścić skrypt opakowujący wokół swoich programów i ustawić tam PATH.
na przykład
staje się:
Również wszystko wywoływane z
cron
powinno być bardzo ostrożne w przypadku programów, które uruchamia i prawdopodobnie ustawiać własny wybór dlaPATH
zmiennej.EDYTOWAĆ:
Jeśli nie wiesz, gdzie jest polecenie, które chcesz wykonać
which <command>
ze swojej powłoki, wskaże ci ścieżkę.EDYCJA2:
Po uruchomieniu programu pierwszą rzeczą, jaką powinien zrobić, jest ustawienie
PATH
i każdej innej wymaganej zmiennej (np.LD_LIBRARY_PATH
) Wartości wymaganych 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ł dane środowisko, ustawiając odpowiednie podczas uruchamiania.
źródło
crontab
.Ustawienie PATH tuż przed wierszem poleceń w moim pliku crontab działało dla mnie:
źródło
Dodanie definicji PATH do crontab użytkownika z poprawnymi wartościami pomoże ... Wypełniłem moją tylko:
I to wystarczy, aby wszystkie moje skrypty działały ... Dołącz tam dowolną niestandardową ścieżkę, jeśli potrzebujesz.
źródło
/etc/crontab
. To najłatwiejsza odpowiedź na poziomie użytkownika. Dobra robota @ Treviño. Zagłosuj na to, jeśli się zgadzasz.Spraw, aby Twoje zmienne działały za Ciebie, umożliwi to dostęp do t
Zdefiniuj swoją ŚCIEŻKĘ w /etc/profile.d/*.sh
Zmienne środowiskowe dla całego systemu
Pliki z rozszerzeniem .sh w katalogu /etc/profile.d są wykonywane za każdym razem, gdy zostanie wprowadzona powłoka logowania bash (np. Podczas logowania z konsoli lub przez ssh), a także przez DisplayManager podczas ładowania sesji pulpitu.
Możesz na przykład utworzyć plik /etc/profile.d/myenvvars.sh i ustawić zmienne w następujący sposób:
Uruchom crontab z opcją logowania!
CRONTAB uruchamia skrypt lub polecenie ze zmiennymi środowiskowymi
źródło
Problem
Twój skrypt działa, gdy uruchamiasz go z konsoli, ale nie działa w cronie.
Przyczyna
Twój plik crontab nie ma odpowiednich zmiennych ścieżki (i prawdopodobnie powłoki)
Rozwiązanie
Dodaj aktualną powłokę i ścieżkę do pliku crontab
Skrypt, który zrobi to za Ciebie
Źródło
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Przykładowe wyjście
źródło
Na moim cronie AIX pobiera swoje zmienne środowiskowe z / etc / environment ignorując to, co jest ustawione w .profile.
Edycja: Sprawdziłem również kilka skrzynek Linuksa w różnym wieku i wydaje się, że również mają ten plik, więc prawdopodobnie nie jest to specyficzne dla systemu AIX.
Sprawdziłem to za pomocą sugestii crona Joemallera i sprawdzając dane wyjściowe przed i po edycji zmiennej PATH w / etc / environment.
źródło
Jeśli nie chcesz wprowadzać tych samych zmian w różnych miejscach, z grubsza zrób to:
Plik. space, a następnie ścieżka do .bashrc i polecenie && są magiczne, aby wprowadzić zmiany środowiska do działającej powłoki bash. Również, jeśli naprawdę chcesz, aby powłoka była bash, dobrym pomysłem jest posiadanie linii w swoim pliku crontab:
Mam nadzieję, że to komuś pomoże!
źródło
Domyślne środowisko dla zadań crona jest bardzo rzadkie i może bardzo różnić się od środowiska, w którym tworzysz swoje skrypty Pythona. W przypadku skryptu, który może być uruchamiany w cronie, każde środowisko, od którego jesteś zależny, powinno być jawnie ustawione. W samym pliku cron dołącz pełne ścieżki do plików wykonywalnych języka Python i skryptów języka Python.
źródło
Wiem, że już na to odpowiedziano, ale pomyślałem, że dla niektórych przyda się. Miałem podobny problem, który niedawno rozwiązałem ( znalazłem tutaj ), a oto najważniejsze kroki, które podjąłem, aby odpowiedzieć na to pytanie:
upewnij się, że masz potrzebne zmienne w PYTHONPATH (znalezione tutaj i tutaj oraz po więcej informacji tutaj) wewnątrz .profile lub .bash_profile dla dowolnej powłoki, w której chcesz przetestować swój skrypt, aby upewnić się, że działa.
edytuj swoją tabelę crontab, aby uwzględnić katalogi potrzebne do uruchomienia skryptu w zadaniu cron (znalezione tutaj i tutaj)
a) pamiętaj, aby uwzględnić katalog główny w zmiennej PATH (.), jak wyjaśniono tutaj (w zasadzie, jeśli uruchamiasz plik wykonywalny za pomocą polecenia, musi on być w stanie znaleźć root lub katalog, w którym plik wykonywalny jest przechowywany) i prawdopodobnie te (/ sbin: / bin: / usr / sbin: / usr / bin)
w swoim pliku crontab utwórz cronjob, który zmieni katalog na katalog, w którym pomyślnie uruchomiłeś skrypt wcześniej (np. Users / user / Documents / foo)
a) Będzie to wyglądać następująco:
źródło
@ Trevino: Twoja odpowiedź pomogła mi rozwiązać problem. Jednak dla początkującego, próbując podać podejście krok po kroku.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- pozwala to zrozumieć, jaka wartość PATH jest obecnie używana przez crontab. Uruchom crontab i pobierz wartość $ PATH używaną przez crontab.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(to przykładowa ścieżka); c) teraz twoje zaplanowane zadanie / skrypt jak*/10 * * * * sh runMyJob.sh &
; d) usuńecho $PATH
z pliku crontab, ponieważ nie jest teraz potrzebny.źródło
Ustaw wymaganą ŚCIEŻKĘ w swoim cronie
Edycja: naciśnij
i
Zapisz i wyjdź
:wq
źródło
Najprostsze obejście, jakie znalazłem, wygląda następująco:
Ten przykład wywołuje
su
jako użytkownik 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 niezawodne niż sourcing .bashrc (który nie działa me) i unika zakodowania określonych ścieżek, co może być problemem, jeśli podajesz przykład lub narzędzie konfiguracyjne i nie wiesz, jaka dystrybucja lub układ plików w systemie użytkownika.Możesz również podać nazwę użytkownika po,
su
jeśli chcesz mieć innego użytkownika niż root, ale prawdopodobnie powinieneś zostawićroot
parametr przedsu
poleceniem, ponieważ zapewniasu
to wystarczające uprawnienia do przełączenia się na dowolnego określonego użytkownika.źródło
Jeśli powinieneś użyć,
webmin
oto kroki, jak ustawićPATH
wartość:źródło