Uruchom zadanie crontab przy użyciu Anaconda env
Chcę, aby zadanie cron wykonało skrypt Pythona przy użyciu już istniejącego środowiska Pythona Anaconda o nazwie my_env. Jedyne, co mogę zrobić, to zlecić zadanie cron uruchomieniu skryptu o nazwie my_script.bash
, który z kolei aktywuje env, a następnie uruchamia skrypt Pythona.
#!/bin/bash
source activate my_env
python ~/my_project/main.py
Próba wykonania tego skryptu z linii poleceń nie działa:
$ sh scripts/my_script.bash
scripts/my_script.bash: 9: scripts/my_script.bash: source: not found
Co muszę zrobić, aby upewnić się, że odpowiednie środowisko jest aktywowane. Its ok to explain it to me like Mam 5 lat.
4 answers
Nie dzwoń sh
ale bash
. source
jest komendą bash.
- sh scripts/my_script.bash
+ bash scripts/my_script.bash
Lub po prostu
chmod +x scripts/my_script.bash
./scripts/my_script.bash
Odkąd dodałeś bash shebang.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 21:11:57
Niedawno przełączyłem się z canopy na Anacondę właśnie po to, aby uniknąć konieczności aktywowania env w zadaniach crona. Anaconda czyni to bardzo prostym, bazując na zmiennej PATH enviornment. (Używam miniconda nie pełnej instalacji Anaconds, ale uważam, że anaconda powinna działać w ten sam sposób)
Są dwa różne podejścia, przetestowałem;
-
Dodaj shebang w skrypcie Pythona, main.py
#!/home/users/user_name/miniconda2/envs/my_env/bin/python
-
Dodaj ścieżkę do na górze crontab
PATH=/home/users/user_name/miniconda2/envs/my_env/bin
Update:
Odpowiedź Jérôme ' a i komentarze cbarricka są poprawne. Właśnie zostałem spalony przy użyciu powyższego podejścia w Conda env, który potrzebowałpynco,
, który potrzebuje pełnego środowiska conda, aby znaleźć właściwe polecenia nco
, takie jak ncks, ncrcat.
rozwiązany przez uruchomienie skryptu bash z crona, który wywołuje conda activate pierwszy.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-20 11:47:18
Po dłuższych zadaniach musiałem crontab
aktywować moje środowisko conda za pomocą conda activate my_env
i uruchomić interpreter Pythona w tym środowisku.
Uwaga używam Ubuntu 18.04.
Tło
Gdy Instalator anacondy inicjuje conda, dodaje fragment na końcu pliku
~/.bashrc
. Plik ten jest wykonywany za każdym razem, gdy użytkownik otwierabash
interaktywnie. Fragment pozwala użytkownikowi na uruchamianie poleceńconda
(ieconda activate my_env
) zbash
.Instalator Anaconda v2020. 02 dodał następujące
conda
snippet in~/.bashrc
:
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
eval "$__conda_setup"
else
if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
. "/opt/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/opt/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<<
- ścieżka
/opt/anaconda3/
do zastąpienia prawidłowym odniesieniem: Zwykle/home/USERNAME/anaconda3/
.
Problem
Sourcing ~/.bashrc
W crontab -e
nie zadziała (przynajmniej nie na Ubuntu).
Wyjaśnienie:
- na Ubuntu,
~/.bashrc
ma następujący (lub podobny) wiersz na początku plik:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
- oznacza to, że jeśli spróbujemy pozyskać plik
~/.bashrc
wcrontab
, reszta pliku.bashrc
Nie uruchomi się, ponieważcrontab
nie działa interaktywnie (Zobacz inny post na ten temat). co oznacza, że powyższy fragmentconda
nigdy nie zostanie wykonany przezcrontab
, nawet jeśli użyjemy~/.bashrc
.
_________ rozwiązanie robocze _________
Rozwiązaniem, które znalazłem, jest skopiowanie fragmentu conda
do oddzielny plik.
1. Kopiowanie fragmentu conda
z ~/.bashrc
do ~/.bashrc_conda
Skopiuj powyższy fragment do innego pliku, na przykład ~/.bashrc_conda
.
Zapewnić, że:
- użytkownik uruchamiający cronjob ma uprawnienia do odczytu tego pliku.
- inni użytkownicy nie mogą pisać do tego pliku (zagrożenie bezpieczeństwa).
2. W crontab -e
Wstaw 2 linie do uruchomienia bash
zamiast sh
i do źródła ~/.bashrc_conda
Uruchom crontab -e
i dodaj w tym celu należy wykonać następujące 2 linie przed cronjob :
SHELL=/bin/bash
BASH_ENV=~/.bashrc_conda
Wyjaśnienie:
SHELL=/bin/bash
oznacza to, żecrontab
uruchomi cronjobs poprzezbash
zamiastsh
(domyślnie). Zobacz post .BASH_ENV=~/.bashrc_conda
źródła fragmentconda
dobash
prowadzony przezchrontab
. Zobacz post i post .
3. W crontab -e
Wstaw w linii cronjob conda activate my_env;
przed żądanym .py
wykonaniem skryptu
Przykład w 2011 roku, w ramach projektu conda, w ramach projektu conda, w ramach projektu conda conda, w ramach projektu conda conda Conda Conda Conda Conda Conda Conda Conda Conda Conda Conda Conda Conda]}
30 12 * * * conda activate my_env; python /path/to/script.py
Zwróć uwagę conda activate my_env;
przed poleceniem uruchomienia interpretera Pythona.
_______________
I voilà , zadziałało.
Jakieś wady?Jeśli fragment conda
w .bashrc
zostanie zaktualizowany przez aktualizację conda
, oczywiście nie będzie odzwierciedlony w oddzielnym pliku .bashrc_conda
. Może być konieczne sprawdzenie aktualizacji od czasu do czas.
Można by też dołączyć ; conda deactivate
na końcu tego cronjoba, ale to może być zbędne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-01 21:14:36
W moim przypadku, dostałem ten błąd podczas uruchamiania tej linii skryptu powłoki: source activate my_env
activate: No such file or directory
Więc zmieniłem source activate my_env
na source /path/to/conda/bin/activate my_env
. Potem zaczyna działać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-02 04:57:12