Próbuję uruchomić polecenie zarządzania Django z crona. Korzystam z virtualenv, aby utrzymać swój projekt w trybie piaskownicy.
Widziałem przykłady tu i gdzie indziej, które pokazują uruchamianie poleceń zarządzania z poziomu virtualenv, takich jak:
0 3 * * * source /home/user/project/env/bin/activate && /home/user/project/manage.py command arg
Jednak pomimo tego, że syslog pokazuje wpis, kiedy zadanie powinno się rozpocząć, zadanie to nigdy się nie uruchamia (plik dziennika skryptu jest pusty). Jeśli uruchomię linię ręcznie z powłoki, działa ona zgodnie z oczekiwaniami.
Jedynym sposobem, w jaki mogę obecnie uruchomić polecenie za pomocą crona, jest rozbicie poleceń i umieszczenie ich w skrypcie otępiającym bash:
#!/bin/sh
source /home/user/project/env/bin/activate
cd /home/user/project/
./manage.py command arg
EDYTOWAĆ:
ars wymyślił działającą kombinację poleceń:
0 3 * * * cd /home/user/project && /home/user/project/env/bin/python /home/user/project/manage.py command arg
Przynajmniej w moim przypadku wywołanie skryptu aktywacyjnego dla virtualenv nic nie zrobiło. To działa, podobnie jak w przypadku serialu.
źródło
env
iexport
wszystkie z nich w pakiecie skryptów bash, który wywołujesz z crontab.Odpowiedzi:
Powinieneś być w stanie to zrobić za pomocą
python
w swoim środowisku wirtualnym:EDYCJA: Jeśli twojego projektu django nie ma w PYTHONPATH, musisz przejść do odpowiedniego katalogu:
Możesz także spróbować zarejestrować awarię z crona:
Kolejną rzeczą do wypróbowania jest wprowadzenie tej samej zmiany w
manage.py
skrypcie na samej górze:źródło
~
pełną ścieżką? (Prawdopodobnie zrobiłeś to, upewniając się, że ...)Uruchamianie
source
z pliku cron nie działa, ponieważ cron używa go/bin/sh
jako domyślnej powłoki, która nie obsługujesource
. Musisz ustawić zmienną środowiskową SHELL na/bin/bash
:Trudno jest ustalić, dlaczego to się nie udaje, ponieważ
/var/log/syslog
nie rejestruje szczegółów błędu. Najlepiej aliasować się do rootowania, aby otrzymywać e-maile z wszelkimi błędami cron. Po prostu dodaj się/etc/aliases
i uruchomsendmail -bi
.Więcej informacji tutaj: http://codeinthehole.com/archives/43-Running-django-cronjobs-within-a-virtualenv.html
powyższy link został zmieniony na: https://codeinthehole.com/tips/running-django-cronjobs-within-a-virtualenv/
źródło
. /path/to/virtualenv/bin/activate
postactivate
plik, powinieneś to zrobićsource /path/to/virtualenv/bin/activate && source /path/to/virtualenv/bin/postactivate
Nie szukaj dalej:
Podejście ogólne:
Piękno tego polega na tym, że NIE musisz zmieniać
SHELL
zmiennej crontab zsh
nabash
źródło
Jedynym poprawnym sposobem uruchamiania zadań cron Pythona podczas korzystania z virtualenv jest aktywacja środowiska, a następnie uruchomienie python środowiska w celu uruchomienia kodu.
Jednym ze sposobów na to jest użycie virtualenv's
activate_this
w skrypcie python, patrz: http://virtualenv.readthedocs.org/en/latest/userguide.html#using-virtualenv-without-bin-pythonInnym rozwiązaniem jest powtórzenie pełnej komendy, w tym aktywacja środowiska i przesłanie go do niego
/bin/bash
. Rozważ to dla/etc/crontab
:źródło
Zamiast grzebać w shebangach specyficznych dla virtualenv, po prostu przejdź
PATH
na crontab.Z aktywowanego virtualenv uruchom te trzy polecenia, a skrypty python powinny po prostu działać:
Pierwsza linia crontab powinna teraz wyglądać tak:
źródło
Dla mnie najlepszym rozwiązaniem było jedno i drugie
man python
wspomina o modyfikacji ścieżki w powłoce w$PYTHONPATH
lub w Pythonie przy pomocysys.path
Inne odpowiedzi wspominają pomysły na wykonanie tego przy użyciu powłoki. Z Pythona dodanie następujących wierszy do mojego skryptu pozwala mi pomyślnie uruchomić go bezpośrednio z crona.
Oto jak wygląda sesja interaktywna -
źródło
Chciałbym to dodać, ponieważ poświęciłem trochę czasu na rozwiązanie problemu i nie znalazłem tutaj odpowiedzi na kombinację użycia zmiennych w cron i virtualenv. Więc może komuś pomoże.
Nie działał dobrze, gdy był skonfigurowany
Dzięki @davidwinterbottom , @ reed-sandberg i @mkb za podanie właściwego kierunku. Akceptowana odpowiedź faktycznie działa poprawnie, dopóki Twój python nie będzie musiał uruchomić skryptu, który musi uruchomić inny plik binarny Pythona z katalogu venv / bin.
źródło
To rozwiązanie sprawdziło się dla mnie dobrze.
Używam miniconda z Condą w wersji 4.7.12 na Ubuntu 18.04.3 LTS.
Jestem w stanie umieścić powyższe w skrypcie i bez problemu uruchomić go za pomocą crontab.
źródło
źródło