Zwykle mam kilka problemów z tym, jak cron wykonuje skrypty, ponieważ normalnie nie mają konfiguracji mojego środowiska. Czy istnieje sposób na wywołanie bash (?) W taki sam sposób, jak robi to cron, aby móc przetestować skrypty przed ich zainstalowaniem?
253
Odpowiedzi:
Dodaj to do swojego crontab (tymczasowo):
Po uruchomieniu wykonaj następujące czynności:
Zakłada się, że twój cron działa / bin / sh, który jest domyślny niezależnie od domyślnej powłoki użytkownika.
źródło
env -
cat ~ / cronenv` / bin / sh` powinien być również zapisany jako zadanie cron? podaj przykładCron domyślnie udostępnia tylko to środowisko:
HOME
katalog domowy użytkownikaLOGNAME
login użytkownikaPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
Jeśli potrzebujesz więcej, możesz zdobyć skrypt, w którym zdefiniujesz środowisko przed tabelą harmonogramu w tabeli crontab.
źródło
.
zwykle nie jest częściąPATH
już, dla względów bezpieczeństwa .Kilka podejść:
Wyeksportuj cron env i zrób to
Dodaj
na swoim crontabie, pozwól mu raz uruchomić, wyłącz go z powrotem, a następnie biegnij
Jesteś teraz w
sh
sesji ze środowiskiem cronaDoprowadź swoje środowisko do crona
Możesz pominąć ćwiczenie i po prostu zrobić
. ~/.profile
przed swoją pracą crona, npUżyj ekranu
Powyższe dwa rozwiązania wciąż zawodzą, ponieważ zapewniają środowisko połączone z działającą sesją X, z dostępem do
dbus
itp. Na przykład w Ubuntunmcli
(Network Manager) będzie działał w dwóch powyższych podejściach, ale nadal zawiedzie w cron.Dodaj powyższą linię do crona, pozwól jej uruchomić się raz, wyłącz go z powrotem. Połącz się z sesją ekranową (screen -r). Jeśli sprawdzasz, czy sesja ekranowa została utworzona (z
ps
), pamiętaj, że czasami są wielkimi literami (np.ps | grep SCREEN
)Teraz nawet
nmcli
i podobne zawiodą.źródło
Możesz uruchomić:
Spowoduje to uruchomienie komendy z pustym środowiskiem.
źródło
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
co wydaje się załatwićW zależności od powłoki konta
lub
From http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html
źródło
Odpowiedź sześć lat później: problem niedopasowania środowiska jest jednym z problemów rozwiązanych przez
systemd
„timery” jako zamiennik crona. Niezależnie od tego, czy uruchamiasz systemową „usługę” z interfejsu CLI, czy za pośrednictwem crona, otrzymuje on dokładnie to samo środowisko, unikając problemu niedopasowania środowiska.Najczęstszym problemem powodującym niepowodzenie zadań cron po ich ręcznym przekazaniu jest restrykcyjne ustawienie domyślne
$PATH
ustawione przez crona, takie jak w Ubuntu 16.04:Natomiast domyślnym
$PATH
ustawieniemsystemd
dla Ubuntu 16.04 jest:Jest więc już większa szansa, że systemowy licznik znajdzie plik binarny bez dalszych kłopotów.
Wadą systemowych timerów jest nieco więcej czasu na ich konfigurację. Najpierw tworzysz plik „usługi”, aby zdefiniować, co chcesz uruchomić, i plik „timera”, aby zdefiniować harmonogram uruchamiania, a na koniec „włączyć” timer, aby go aktywować.
źródło
Utwórz zadanie cron, które uruchamia env i przekierowuje standardowe wyjście do pliku. Użyj pliku obok „env -”, aby stworzyć to samo środowisko co zadanie cron.
źródło
Nie zapominaj, że ponieważ rodzicem crona jest init, uruchamia on programy bez terminala sterującego. Możesz to zasymulować za pomocą takiego narzędzia:
http://libslack.org/daemon/
źródło
Domyślnie
cron
wykonuje zadania przy użyciu dowolnego pomysłu systemush
. To może być rzeczywiste lub powłoki Bournedash
,ash
,ksh
ibash
(lub inny) dowiązane dosh
(i w rezultacie działa w trybie POSIX).Najlepiej jest upewnić się, że skrypty mają to, czego potrzebują, i założyć, że nic dla nich nie ma. Dlatego powinieneś używać pełnych specyfikacji katalogu i ustawiać zmienne środowiskowe, takie jak
$PATH
ty.źródło
0 0 * * 1 /path/to/executable >/dev/null 2>&1
a następnie w „wykonywalnym” ustawiłbym wartości dla$PATH
itd. I użyłem pełnych specyfikacji katalogów do plików wejściowych i wyjściowych itp. Na przykład:/path/to/do_something /another/path/input_file /another/path/to/output_file
Innym prostym sposobem, który znalazłem (ale może być podatny na błędy, wciąż testuję) jest pozyskanie plików profilu użytkownika przed poleceniem.
Edycja skryptu /etc/cron.d/:
Zmieniłoby się w:
Brudny, ale wykonał dla mnie robotę. Czy istnieje sposób na symulację logowania? Tylko polecenie, które możesz uruchomić?
bash --login
nie działało Wygląda na to, że byłby to jednak lepszy sposób.EDYCJA: To wydaje się być solidnym rozwiązaniem: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
źródło
Zaakceptowana odpowiedź umożliwia uruchomienie skryptu w środowisku, którego używa cron. Jak zauważyli inni, nie jest to jedyne potrzebne kryterium do debugowania zadań cron.
Rzeczywiście, cron używa również nieinteraktywnego terminala, bez dołączonego wejścia itp.
Jeśli to pomoże, napisałem skrypt, który umożliwia bezbolesne uruchomienie polecenia / skryptu, tak jakby był uruchamiany przez crona. Wywołaj go za pomocą polecenia / skryptu jako pierwszego argumentu i jesteś dobry.
Ten skrypt jest również hostowany (i prawdopodobnie aktualizowany) w Github .
źródło
Odpowiedź https://stackoverflow.com/a/2546509/5593430 pokazuje, jak uzyskać środowisko cron i używać go w skrypcie. Należy jednak pamiętać, że środowisko może się różnić w zależności od używanego pliku crontab. Utworzyłem trzy różne wpisy cron, aby za pomocą zapisać środowisko
env > log
. Są to wyniki w Amazon Linux 4.4.35-33.55.amzn1.x86_64.1. Globalny / etc / crontab z użytkownikiem root
2. Użytkownik crontab root (
crontab -e
)3. Skrypt w /etc/cron.hourly/
Co najważniejsze
PATH
,PWD
aHOME
różnią. Upewnij się, że ustawiłeś je w skryptach cron, aby opierały się na stabilnym środowisku.źródło
Nie wierzę w to; jedynym sposobem, w jaki wiem, aby przetestować zadanie crona, jest skonfigurowanie go do uruchomienia za minutę lub dwie w przyszłości, a następnie czekania.
źródło