Zdefiniowałem zmienną „SHELL” w pliku / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Dodatkowo, wszystkie moje skrypty w pliku / etc / crontab są uruchamiane przez użytkownika „martin”. Jednak /home/martin/.bash_profile (dla powłoki logowania) i /home/martin/.bashrc (dla powłoki nielogującej ) zawierają pewne zmienne, które są ignorowane w przypadku zadania cron, ale są używane w przypadku, gdy zaloguję się na maszynie SSH lub otwórz nową sesję bash. Dlaczego cron ignoruje te zmienne? Czy cron nie wykonuje po prostu „/ usr / local / bin / bash my-script.sh” z uprawnieniami dla użytkownika „martin”?
.bashrc
ma linię, która powstrzymuje ją przed uruchomieniem w nieinteraktywnych powłokach.Odpowiedzi:
Możesz pobrać plik, który chcesz na górze skryptu lub na początku zadania dla użytkownika, który wykonuje zadanie. Polecenie „source” jest wbudowane. Zrobiłbyś to samo, gdybyś dokonał edycji tych plików, aby załadować zmiany.
lub
źródło
bash
powłoki. Dodałem odpowiedź, która może obsłużyć skrzynkę, gdy jest to powłokash
.Ponieważ to nie jest interaktywna powłoka. To samo dzieje się po otwarciu niektórych terminali.
Spójrz na to pytanie: Co to jest plik .bashrc? | Super użytkownik
A także w tym:
Jaka jest różnica między .bashrc, .bash_profile i .environment? | Przepełnienie stosu
Różne skrypty są uruchamiane w zależności od tego, czy połączenie jest powłoką logowania (czy nie), powłoką interaktywną (czy nie), czy też jednymi i drugimi.
Jeśli chcesz zrobić bashrc, musisz wprowadzić tę zmianę:
Źródło: Pliki startowe Bash | Podręcznik referencyjny Bash | gnu.org
źródło
Może nie być w stanie uruchomić
source
, jeślish
powłoka jest używany. Można to zmienić, dodając następujący wiersz do tabeli:Możesz także określić środowisko:
lub możesz użyć swojego lokalnego,
/home/user/.bashrc
jeśli jest to zadanie cron użytkownika (npcrontab -e
.).Pamiętaj, że
.bash_profile
można go zastąpić.bashrc
, jeśli istnieje.Credit: Jak zmienić powłokę crona (sh na bash)?
źródło
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
.bashrc
Inną rzeczą, która może zakłócać pozyskiwanie twoich zasobów przez cronjob, są wszelkie kontrole wykonywane przez ten plik w celu wykrycia interaktywnych powłok.Na przykład w systemie Ubuntu 18.04 domyślna wartość
.bashrc
dla użytkownika zaczyna się od:a więc pozyskiwanie nie przyniesie nic pożytecznego, ponieważ natychmiast zakończy działanie.
źródło
Możesz wywołać bash z
-l
opcją, jak poniżej:Ta
-l
opcja sprawia, że bash jest powłoką logowania . W ten sposób odczyta użytkownika.bash_profile
. Nie będzie czytać użytkownika,.bashrc
chyba że zostanie to wyraźnie pozyskane przez.bash_profile
. Jest tak, ponieważ nieinteraktywne powłoki nie odczytują się automatycznie.bashrc
. Ale nie powinieneś potrzebować.bashrc
zadania crona, ponieważ.bashrc
służy ono do ustawiania rzeczy przydatnych dla interaktywnej powłoki.Wariacje:
Jeśli bash jest na ŚCIEŻCE, nie ma potrzeby określania ścieżki bezwzględnej:
Optymalizacją byłoby zastąpienie bieżącej powłoki za pomocą
exec
:źródło
bash
działa inaczej, niezależnie od tego, czy jest to powłoka, czy zwykły język programowania (jakperl
lubpython
).Zgodnie z projektem, ustawienia w
~/.bash_profile
,~/.bashrc
itp są dla użytkowników, aby ustawić rzeczy, gdybash
odgrywa rolę powłoki (shell logowania interractive shell). Pomyśl o środowisku, które masz wxterm
(powłoce interaktywnej) lub wssh
sesjach (powłoka logowania) lub w konsolach (powłoka logowania).Z drugiej strony
bash
jest także potężnym językiem programowania - pomyśl o wielu skryptach do zarządzania usługamisystemd
- który wymaga innego stylu pracy. Na przykład, gdy programista pisze skrypt systemowy lubbash
program, nie będzie chciał~/.bash_profile
automatycznie pozyskiwać użytkownika . Jest to normalny program, a nie powłoka. Normalny program (w tymbash
programy) w naturalny sposób dziedziczy ustawienia z bieżącego środowiska roboczego (powłoki), ale ich nie ustawia .Jeśli napiszemy program dla
cron
inbash
- akurat się w nim zapisujebash
; w rzeczywistości, możemy zapisać go wpython
lubperl
lub inny progamming language- wtedy możemy mieć opcję źródełbash
„s~/.bash_profile
(czytaj: ustawienie muszli użytkownika, który okazuje się być tym samym języku, języku programowania):Co jednak, jeśli ten konkretny użytkownik nie używa
bash
swojej powłoki? On / ona może używaćzsh
,ksh
,fish
, itd. Tak, że praktyka nie naprawdę działa przy pisaniu programu do użytku publicznego.Możesz więc zdobyć źródło,
~/.bash_profile
jeśli uważasz, że to zadziała. Ale tutaj nie chodzi o to, czy jesteśmy w stanie pobrać plik, chodzi o to, jak powinno działać w systemie: koncepcja projektowa . W skrócie: powinniśmy postrzegaćbash
jako coś mającego 2 role: powłokę i język programowania . Wtedy wszystko będzie znacznie łatwiejsze do zrozumienia.źródło
Miałem ten sam problem podczas uruchamiania aplikacji węzła z crona, która korzysta z NVM. Aby zrobić powłokę bash do odczytu pliku .bashrc z crona, wystarczy wywołać polecenie bash z opcją interaktywnej powłoki `-l.
na przykład:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Jeśli to nie zadziała, spróbuj ustawić zmienną ścieżki w crontab
źródło
Mój sposób na poradzenie sobie z tym był następujący:
1) Umieszczanie moich zmiennych w (koniec)
~/.profile
:2) Tworzenie skryptu Bash dla moich (codziennych) zadań cron (
~/cronDaily.sh
) zawierających moje polecenia oraz powtarzalne pozyskiwanie~/.profle
:3) planowanie wykonania skryptu
crontab
, aby uruchamiał się codziennie:Moja zmienna nie została zignorowana, a polecenia uruchomiły się pomyślnie.
Niektórzy mogą powiedzieć, że takie intensywne pozyskiwanie
~/.profile
jest problematyczne. W moim szczególnym przypadku nie rozumiem, dlaczego jest to problem, ale radziłbym rozważyć utworzenie dedykowanego pliku do tego celu.Ogólnie rzecz biorąc, może być lepszy sposób na to, ale to działało dla mnie po dużym bólu i wyjaśnia zasadę, że od Bash 4.3.46 nie można pobrać pliku
crontab
.źródło