Uruchomiłem zadanie crontab 0 2 */1 * * /aScript >aLog.log 2>&1
jako użytkownik „root”, ale zauważyłem, że env różni się od env użytkownika „root” i dlatego mam inne zachowanie w czasie wykonywania moich skryptów.
Poprawką próbną było umieszczenie poleceń eksportu w plikach rc.d, ale wciąż się nie wyświetlało! W końcu umieszczam polecenia eksportu w samym aScript .
Moje pytanie brzmi: czy jest lepszy sposób na rozwiązanie tego problemu? i dlaczego brakuje env, mimo że pochodzi od tego samego użytkownika „root”? (Modyfikuję crontab, uruchamiając 'crontab -e' z katalogu głównego)
linux
cron
environment-variables
Bambus
źródło
źródło
source
swój profil (bash).Odpowiedzi:
Cron zawsze działa z prawie pustym środowiskiem. HOME, LOGNAME i SHELL są ustawione; i bardzo ograniczona ŚCIEŻKA. Dlatego zaleca się stosowanie pełnych ścieżek do plików wykonywalnych i eksportowanie dowolnych zmiennych potrzebnych w skrypcie podczas korzystania z crona.
Istnieje kilka metod ustawiania zmiennych środowiskowych w cron, ale wszystkie sprowadzają się do ustawienia jej w skrypcie.
Podejście 1:
Ustaw każdą potrzebną zmienną ręcznie w skrypcie.
Podejście 2:
Źródło swojego profilu:
. $HOME/.bash_profile
(lub. $HOME/.profile
)(Zazwyczaj przekonasz się, że powyższy plik będzie źródłem innych plików (np. ~ / .Bashrc -> / etc / bashrc -> /etc/profile.d/*) - jeśli nie, możesz również je zdobyć.)
Podejście 3:
Zapisz zmienne środowiskowe w pliku (uruchom jako pożądany użytkownik):
Następnie zaimportuj za pomocą skryptu cron:
Podejście 4:
W niektórych przypadkach możesz ustawić globalne zmienne cron w
/etc/default/cron
. Istnieje jednak pewien element ryzyka, ponieważ zostaną one ustawione dla wszystkich zadań cron.źródło
bash: SHELL=/bin/bash: No such file
Cron tworzy swoją WŁASNĄ powłokę przy użyciu określonego sposobu działania.
Tak więc, jeśli chcesz zachować tę samą zmienną użytkownika, spróbuj uruchomić ją z własnym użytkownikiem, zamiast rootem lub innym użytkownikiem.
Lub
Najlepszym sposobem jest eksport tych zmiennych we własnym skrypcie.
źródło
W RedHat CentOS możesz ustawić /etc/rc.d/init.d/functions domyślną ŚCIEŻKĘ na stałe. /etc/rc.d/crond wywołuje funkcje podczas uruchamiania.
źródło
Miałem podobny problem z AWS. Tak to rozgryzłem
podał mi
/usr/bin/local/python3
lokalizacjęi wtedy
źródło