
Configuré un servidor Airflow instalado dentro de un entorno conda para ejecutar algunas automatizaciones programadas. Actualmente, ejecuto el programador, los trabajadores y el servidor web directamente usando nohup
, pero me gustaría usar systemd para administrarlo de manera más sólida.
Sin embargo, tengo problemas al iniciar el sistema con systemctl start
. Agregué a mi .service
archivo lo siguiente:
ExecStartPre=. /etc/profile ; /home/shared/miniconda2/bin/conda activate airflow
ExecStart=/home/shared/miniconda2/envs/airflow/bin/airflow webserver --pid /run/airflow/webserver.pid
(donde shared/
no hay un usuario, solo una carpeta dentro /home/
a la que todos los usuarios tienen acceso)
ExecStart
requiere airflow
que se active el entorno conda en el que realmente está instalado el flujo de aire. Para hacer esto, agregué los dos comandos que se ven en ExecStartPre
: el segundo realmente activa este entorno. Al ejecutar esto solo se devuelve CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
, así que agregué el primero para asegurarme de /etc/profile.d/conda.sh
que esté cargado.
Sin embargo, esto todavía falla, aparentemente al intentar ejecutar el 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
(Se omiten las marcas de tiempo para mejorar un poco la legibilidad)
Esto plantea una serie de preguntas:
- ¿Qué podría estar causando que mi servicio falle?
- ¿Mi configuración no tiene sentido (systemd + conda + airflow)?
- Si no tiene sentido, ¿existe una mejor manera de hacer funcionar el flujo de aire de manera más sólida que lanzarlo directamente? Estaba particularmente interesado en las
enable
opcionesrestart
que ofrece systemd.
Respuesta1
Espero que ya hayas resuelto tu problema, pero como referencia aquí está mi solución.
La forma en que lo resolví fue agregar un nivel de dirección indirecta para lanzar el flujo de aire. Tengo un script bash, por ejemplo, airflow_runner.sh
con lo siguiente
conda activate airflow-env
$AIRFLOW_BIN/airflow $@
Luego en mi archivo de unidad systemd
ExecStart=PATH_TO_SCRIPT/airflow_runner.sh webserver --pid /run/airflow/webserver.pid