Tengo un servicio systemd que llama a un script PHP que crea una tmux
sesión al arrancar.
A nivel global tengo el más actual tmux
para la distro (V>=2.5).
El script USER
tiene un $HOME/bin/tmux
nivel de 2.0.
Lo que necesito es que esto systemd
use el tmux
binario 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 PATH
en 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-file
nombre a algo más sensato, pero la ruta user_envfile
debe 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 ( foo
siendo el archivo /etc/pam.d
creado anteriormente):
PAMName=foo
Ahora, cuando inicie el servicio (después de recargar, etc.), se ejecutarán los session
módulos , que en este caso es solo/etc/pam.d/foo
pam_env
. pam_env
cargará 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 PATH
está establecido en un valor predeterminado en /etc/environment
, el entorno del usuario antepone este valor predeterminado.
Aquí, el valor predeterminado user_envfile
es .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.d
que tenga user_readenv=1
, pero otros módulos PAM pueden causar efectos secundarios no deseados.
Respuesta2
Parece terriblemente hack, pero anteponer una $PATH
actualizació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/airflow
archivo, 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í.