servicio-programador de flujo de aire

servicio-programador de flujo de aire

Tengo un servicio systemd que llama a un script PHP que crea una tmuxsesión al arrancar.

A nivel global tengo el más actual tmuxpara la distro (V>=2.5).
El script USERtiene un $HOME/bin/tmuxnivel de 2.0.

Lo que necesito es que esto systemduse el tmuxbinario en el $HOME del usuario.
He configurado las variables USUARIO Y GRUPO en el archivo de servicio systemd pero parece llamar al binario instalado globalmente.

¿Es posible establecer explícitamente el binario que se debe llamar para esta invocación de servicio?

Si es posible, prefiero no empezar a codificar la ruta en el archivo PHP.

Muchas gracias.

Respuesta1

Podrías codificar el PATHen el servicio systemd:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Más flexible sería PAM. Es tremendamente indirecto en comparación con simplemente usar bash -c '....', pero puedes hacerlo con PAM.

Cree una nueva configuración PAM en /etc/pam.d(digamos /etc/pam.d/foo) y agregue:

session    required     pam_env.so user_envfile=some-file user_readenv=1

Y en /home/someUser/some-file, agrega:

PATH DEFAULT=/home/someUser/bin:${PATH}

Por supuesto, puede ajustar el some-filenombre a algo más sensato, pero la ruta user_envfiledebe ser relativa al directorio de inicio del usuario (el usuario que configuró User=en el servicio).

Luego, en el archivo de servicio, en la [Service]sección, agregue ( foosiendo el archivo /etc/pam.dcreado anteriormente):

PAMName=foo

Ahora, cuando inicie el servicio (después de recargar, etc.), se ejecutarán los sessionmódulos , que en este caso es solo/etc/pam.d/foopam_env. pam_envcargará variables de entorno desde /etc/environment, sujetas a restricciones en /etc/security/pam_env.conf, y luego el entorno del usuario desde ~/some-file. Dado que PATHestá establecido en un valor predeterminado en /etc/environment, el entorno del usuario antepone este valor predeterminado.

Aquí, el valor predeterminado user_envfilees .pam_environment, que también lo lee la configuración PAM de otras cosas como el inicio de sesión SSH o LightDM, etc. Utilicé un archivo diferente aquí en caso de que no quieras afectar estas cosas. Puede eliminarlo user_envfile=...y utilizar el predeterminado ~/.pam_environment. También puede usar una configuración PAM existente /etc/pam.dque tenga user_readenv=1, pero otros módulos PAM pueden causar efectos secundarios no deseados.

Respuesta2

Parece terriblemente hack, pero anteponer una $PATHactualización parece funcionar.
Sin embargo, estoy atento a los efectos secundarios. . .

Ejemplo:

ExecStart=/bin/bash -c "PATH=/home/someUser/bin:$PATH exec /usr/bin/php /some/path/to/a/script.php"

Respuesta3

Sé que estoy buscando una publicación un poco anticuada, pero yo también estaba tratando de descubrir cómo podría configurar las variables de entorno/RUTA para poder hacer que el programador se ejecute automáticamente cuando el servidor esté en ejecución.

Encontré una solución que me funciona en Ubuntu 18.04 y 18.10

Proporcioné un artículo completo sobre cómoinstalar Airflow y PostgreSQLen el backend del enlaceaquí.

**de la última parte de mi artículo. Básicamente, todo se reduce a realizar un cambio específico en el archivo airflow-scheduler.system.

Este es uno de los 'errores' para una implementación en Ubuntu. El equipo de desarrollo que creó Airflow lo diseñó para ejecutarse en una distribución diferente de Linux y, por lo tanto, es necesario realizar un pequeño (pero crítico) cambio para que Airflow se ejecute automáticamente cuando el servidor esté encendido. Los archivos de servicio predeterminados de systemd inicialmente se ven así:

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

Sin embargo, esto no funcionará ya que el protocolo 'EnvironmentFile' no funciona en Ubuntu 18. En su lugar, comente esa línea y agregue:

Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Es probable que desee crear un archivo de servicio systemd al menos para Airflow Scheduler y probablemente también para el servidor web si desea que la interfaz de usuario también se inicie automáticamente. De hecho, queremos ambos en esta implementación, por lo que crearemos dos archivos, airflow-scheduler.service y airflow-webserver.service. Ambos se copiarán en la carpeta /etc/systemd/system. Estos son los siguientes:


servicio-programador de flujo de aire

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target
#airflow-webserver.service

servicio.servidor-web-flujo de aire

[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]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Finalmente, con ambos archivos copiados a la carpeta /etc/systemd/systemd mediante un comando de copia de superusuario sudo cp, es hora de encender el motor:

sudo systemctl enable airflow-scheduler sudo systemctl start airflow-scheduler sudo systemctl enable airflow-webserver sudo systemctl start airflow-webserver

Respuesta4

En un servicio que estaba configurando (Apache Airflow), tenía configurado un archivo de entorno.

En mi /etc/systemd/system/airflowarchivo, tenía esta línea:

[Service]
EnvironmentFile=/etc/default/airflow

Al abrir este archivo de entorno, agregué la línea que necesitaba, en mi caso:

SCHEDULER_RUNS=5
PATH=/opt/anaconda3/bin:$PATH

Agregue cualquier ruta a los ejecutables que necesite para que el servicio pueda acceder aquí y todo estará bien. Funcionó bien para mí.

información relacionada