Usando o systemd para executar o fluxo de ar dentro do ambiente conda

Usando o systemd para executar o fluxo de ar dentro do ambiente conda

Configurei um servidor Airflow instalado em um ambiente conda para executar algumas automações agendadas. Atualmente, eu inicio o agendador, os trabalhadores e o servidor web diretamente usando o nohup, mas gostaria de usar o systemd para gerenciá-lo de forma mais robusta.

No entanto, estou tendo problemas para iniciar o sistema com o systemctl start. Adicionei ao meu .servicearquivo o seguinte:

ExecStartPre=. /etc/profile ; /home/shared/miniconda2/bin/conda activate airflow
ExecStart=/home/shared/miniconda2/envs/airflow/bin/airflow webserver --pid /run/airflow/webserver.pid

(onde shared/não é um usuário, apenas uma pasta dentro /home/da qual todos os usuários têm acesso)

ExecStartrequer que o airflowambiente conda no qual o fluxo de ar está realmente instalado seja ativado. Para fazer isso, adicionei os dois comandos vistos em ExecStartPre: o segundo realmente ativa este ambiente. Executar isso sozinho retorna CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'., então adicionei o primeiro para garantir /etc/profile.d/conda.shque esteja carregado.

No entanto, isso ainda falha, aparentemente ao tentar executar o servidor Gunicorn:

Running the Gunicorn Server with:
Workers: 4 sync
Host: 0.0.0.0:8080
Timeout: 120
Logfiles: - -
=================================================================
Traceback (most recent call last):
  File "/home/shared/miniconda2/envs/airflow/bin/airflow", line 28, in <module>
    args.func(args)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/site-packages/airflow/bin/cli.py", line 844, in webserver
    gunicorn_master_proc = subprocess.Popen(run_args)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 390, in __init__
    errread, errwrite)
  File "/home/shared/miniconda2/envs/airflow/lib/python2.7/subprocess.py", line 1025, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

(carimbos de data e hora omitidos para melhorar um pouco a legibilidade)

Isso levanta uma série de questões:

  • O que pode estar causando a falha do meu serviço?
  • Minha configuração é absurda (systemd + conda + airflow)?
  • Se não fizer sentido, existe uma maneira melhor de executar o fluxo de ar de forma mais robusta do que lançá-lo diretamente? Fiquei particularmente interessado nas enableopções restartque o systemd oferece.

Responder1

Espero que agora você tenha resolvido seu problema, mas para referência aqui está minha solução.

A maneira como resolvi foi adicionar um nível de indireção para lançar o fluxo de ar. Eu tenho um script bash, por exemplo, airflow_runner.shcom o seguinte

conda activate airflow-env
$AIRFLOW_BIN/airflow $@

Então, no meu arquivo de unidade systemd

ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid

informação relacionada