python 2.7 - ¿Cómo reinicio el servidor web de flujo de aire?
python-2.7 airflow (6)
Estoy utilizando el flujo de aire para mi proyecto de tubería de datos. He configurado mi proyecto en flujo de aire e inicio el servidor de flujo de aire como un proceso de back-end usando el siguiente comando
aiflow webserver -p 8080 -D True
Servidor ejecutándose exitosamente en el backend. Ahora quiero habilitar la autenticación en el flujo de aire y realizar cambios de configuración en airflow.cfg, pero la funcionalidad de autenticación no se refleja en el servidor. Cuando detengo e inicio el servidor de flujo de aire en mi máquina local, funciona.
Entonces, ¿cómo puedo reiniciar el proceso del servidor web de flujo de aire de mi daemon en mi servidor?
Usar el manejo de la señal del servidor web Airflow (Gunicorn).
Airflow utiliza gunicorn como servidor HTTP, por lo que puede enviar señales estándar de estilo POSIX. Una señal comúnmente utilizada por los demonios para reiniciar es HUP
.
Necesitará ubicar el archivo pid para el daemon del servidor web de flujo de aire para obtener la identificación de proceso correcta para enviar la señal. Este archivo podría estar en $AIRFLOW_HOME
o también /var/run
, que es donde encontrará muchos pids.
Suponiendo que el archivo pid está en /var/run
, podría ejecutar el comando:
cat /var/run/airflow-webserver.pid | xargs kill -HUP
gunicorn utiliza un modelo de preforking, por lo que tiene procesos maestros y de trabajo. La señal HUP
se envía al proceso maestro, que realiza estas acciones:
HUP: vuelva a cargar la configuración, inicie los nuevos procesos de trabajo con una nueva configuración y cierre con gracia los trabajadores más antiguos. Si la aplicación no está precargada (utilizando la opción preload_app), Gunicorn también cargará la nueva versión.
Más información en los documentos de manejo de señales gunicorn .
Esta es principalmente una versión expandida de la respuesta de captaincapsaicin, pero usando HUP
(SIGHUP) en lugar de KILL
(SIGKILL) para recargar el proceso en lugar de matarlo y reiniciarlo.
¿Puede consultar $AIRFLOW_HOME/airflow-webserver.pid
para la ID de proceso de su demonio de servidor web?
Entonces pásale una señal de muerte para matarlo
cat $AIRFLOW_HOME/airflow-webserver.pid | xargs kill -9
Entonces solo corre
airflow webserver -p 8080 -D True
para reiniciar el daemon
Aconsejo ejecutar el flujo de aire de manera robusta, con auto-recuperación con systemd
para que puedas hacer
- para systemctl start airflow
inicio systemctl start airflow
- para systemctl stop airflow
- para reiniciar systemctl restart airflow
Para esto necesitarás un archivo ''unit'' de systemd. Como ejemplo (de trabajo) puede usar lo siguiente:
put it in /lib/systemd/system/airflow.service
[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
PIDFile=/run/airflow/webserver.pid
EnvironmentFile=/home/airflow/airflow.env
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/bash -c ''export AIRFLOW_HOME=/home/airflow ; airflow webserver --pid /run/airflow/webserver.pid''
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=42s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
PS: cambia AIRFLOW_HOME a donde está tu carpeta de flujo de aire con la configuración
Esto funcionó para mí (varias veces!: D)
encuentre el id del proceso: (asumiendo que 8080 es el puerto)
lsof -i tcp:8080
mátalo
kill <pid>
Ninguno de estos funcionó para mí. Tuve que eliminar el $AIRFLOW_HOME/airflow-webserver.pid
y, a continuación, funcionó el airflow webserver
.
cree un script de inicio y use el comando "daemon" para ejecutar esto como servicio.
daemon --user = "$ {USER}" --pidfile = "$ {PID_FILE}" airflow webserver -p 8090 >> "$ {LOG_FILE}" 2> & 1 &