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.

Author: Anders_K, 2016-04-01

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.

 12
Author: Jérôme,
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.
 21
Author: Eric Bridger,
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 otwiera bash interaktywnie. Fragment pozwala użytkownikowi na uruchamianie poleceń conda (ie conda activate my_env) z bash.

  • 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 w crontab, reszta pliku .bashrc Nie uruchomi się, ponieważ crontab nie działa interaktywnie (Zobacz inny post na ten temat). co oznacza, że powyższy fragment conda nigdy nie zostanie wykonany przez crontab, 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, że crontab uruchomi cronjobs poprzez bash zamiast sh (domyślnie). Zobacz post .

  • BASH_ENV=~/.bashrc_conda źródła fragment conda do bash prowadzony przez chrontab. 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.

 5
Author: Jean Monet,
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ć.

 2
Author: Youngmin Kim,
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