(Przeczytałem już Jak mogę przetestować nowy skrypt cron? )
Mam konkretny problem (zadanie CRON nie wydaje się działać lub działa poprawnie), ale problem jest ogólny: chciałbym debugować skrypty, które są kontrolowane. Wiem, że mogę skonfigurować linię crontab * * * * *, ale nie jest to w pełni zadowalające rozwiązanie. Chciałbym móc uruchomić zadanie cron z wiersza poleceń, tak jakby uruchomiło je cron (ten sam użytkownik, te same zmienne środowiskowe itp.). Czy jest na to sposób? Nie trzeba czekać 60 sekund na przetestowanie zmian skryptu.
Odpowiedzi:
Oto co zrobiłem i wydaje się, że działa w tej sytuacji. Przynajmniej pokazuje mi błąd, podczas gdy uruchamiany z wiersza poleceń, ponieważ użytkownik nie pokazuje błędu.
Krok 1 : Tymczasowo umieszczam ten wiersz w crontab użytkownika:
następnie wyjął go po zapisaniu pliku.
Krok 2 : Zrobiłem sobie mały skrypt bash typu run-as-cron zawierający:
Tak więc, jako dany użytkownik, byłem w stanie
To rozwiązanie można oczywiście rozszerzyć, aby korzystać z sudo lub podobnego rozwiązania dla większej elastyczności.
Mam nadzieję, że to pomaga innym.
źródło
/usr/bin
. 2)cat …/cron-env
Wyprowadza wiele linii, co nie działa. Po prostu spróbuj uruchomić/usr/bin/env -i $(cat cron-env) echo $PATH
w terminalu, środowisko wyjściowe dosłownie zamiast go używać. 3) Obecne środowisko wycieka do emulowanego środowiska cron. Spróbuj:export foo=leaked; run-as-cron echo $foo
.cat
wyprowadza wiele wierszy, które działają, ponieważ podstawienie powłoki zrzuca je do jednej linii, którą można sprawdzićecho $(cat cron-env ) | wc
; twoje przykładowe polecenie,/usr/bin/env -i $(cat cron-env) echo $PATH
zastępuje$PATH
powłokę wywołującą; zamiast tego powinien wywoływać podpowłokę w celu podstawienia w podśrodowisku, np/usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'
. 3. Popełniłeś ten sam błąd, ponownie zastępując powłokę wywołującą zamiast podśrodowiskaPrzedstawiam rozwiązanie oparte na odpowiedzi Pistos, ale bez wad.
Dodaj następujący wiersz do crontab, np. Używając
crontab -e
Utwórz skrypt powłoki, który wykonuje polecenie w tym samym środowisku, w którym uruchamiane są zadania cron:
Posługiwać się:
na przykład
Zauważ, że drugi argument musi zostać zacytowany, jeśli wymaga argumentu. Pierwszy wiersz skryptu ładuje powłokę POSIX jako interpreter. Drugi wiersz pobiera plik środowiska cron. Jest to wymagane do załadowania poprawnej powłoki, która jest przechowywana w zmiennej środowiskowej
SHELL
. Następnie ładuje puste środowisko (aby zapobiec wyciekaniu zmiennych środowiskowych do nowej powłoki), uruchamia tę samą powłokę, która jest używana dla cronjobs i ładuje zmienne środowiskowe cron. Na koniec polecenie jest wykonywane.źródło
Ponieważ crontab nie wykonuje zadania, będziesz manipulować jego zawartością:
Co to robi :
źródło
sudo -H -u otheruser bash -c 'crontab..."
uruchomić crontab innego użytkownika btwDomyślnie w przypadku większości domyślnych demonów cron, które widziałem, po prostu nie ma sposobu, aby powiedzieć cronowi, aby teraz działał tutaj. Jeśli używasz anakronu, być może możliwe jest uruchomienie osobnej instancji na pierwszym planie.
Jeśli twoje skrypty nie działają poprawnie, nie bierzesz tego pod uwagę
Z crontab (5):
Ogólnie ŚCIEŻKA jest największym problemem, dlatego musisz:
Jeśli chcesz uruchomić skrypt jako inny użytkownik bez powłoki (np. Www-data), użyj sudo:
Pierwszą rzeczą do przetestowania przed tym wszystkim jest oczywiście to, że skrypt faktycznie robi to, co powinien, z wiersza poleceń. Jeśli nie możesz uruchomić go z wiersza poleceń, to oczywiście nie będzie działał z cronem.
źródło
Z jakiegoś powodu skrypt Marco nie działał dla mnie. Nie miałem czasu na debugowanie, więc napisałem skrypt w języku Python, który robi to samo. Jest dłuższy, ale: po pierwsze, działa dla mnie, a po drugie, łatwiej mi zrozumieć. Zmień „/ tmp / cron-env” na miejsce, w którym zapisałeś swoje środowisko. Oto on:
źródło
Cóż, użytkownik jest taki sam jak ten, który umieściłeś we wpisie crontab (lub na którego crontab wkładasz go naprzemiennie), więc nie ma wątpliwości.
crontab
(5) powinien dać ci listę ustawionych zmiennych środowiskowych, jest tylko kilka.źródło
W większości crontabów, takich jak np. Vixie-cron, możesz umieścić zmienne w samym crontabie w ten sposób, a następnie użyć / usr / bin / env, aby sprawdzić, czy zadziałało. W ten sposób możesz sprawić, by skrypt działał w crontab, gdy dowiesz się, co jest nie tak ze skryptem run-as-cron.
źródło
Rozwiązanie Marco nie działało dla mnie, ale skrypt Pythona Noama działał. Oto niewielka modyfikacja skryptu Marco, która sprawiła, że zadziałał dla mnie:
Dodano
set -a
zmienne eksportu zdefiniowane w skrypcie $ 1 i udostępniono je do polecenia $ 2ps Pyton Noama działał, ponieważ „eksportował” środowisko do procesu potomnego.
źródło
Jeśli jest to skrypt powłoki, powinno to zapewnić ci większość możliwości:
Na pewno uwypukli niektóre problemy, jeśli nie wszystko.
źródło
Nigdy nie znalazłem sposobu na ręczne uruchamianie zadań crona, ale ten zapis sugeruje ustawienie tego samego środowiska, które miałoby cronjob i ręczne uruchomienie skryptu.
źródło
możesz zaprogramować pracę, aby rozpocząć następną minutę :)
źródło
Zastanawiałem się nad odpowiedzią Marco. Kod pokazano poniżej, ale utrzymam ten skrypt tutaj .
Biorąc pod uwagę ten crontab:
Przykładowa sesja użytkowania:
To
cronTest2
, co musi być prawidłowo wywołany skonfigurować zmienne środowiskowe w taki sam sposób, jak robi cron:cronTest
działacronTest2
z ustawionymi odpowiednimi zmiennymi środowiskowymi:źródło