Estamos configurando un clúster SGE con CentOS 6. Mi administrador de sistemas está instalando aplicaciones que no se instalan a través de RPM (es decir, a través de otros medios como make install) y deben ir en un directorio no estándar, en este caso algo como /share/apps/install/bin/
. La ruta para esto se agrega actualmente a la mayoría de las sesiones (iniciar sesión, qlogin, etc.) a través de /share/apps/etc/environment.sh
la cual se llama mediante /etc/bashrc
. environment.sh
También agrega algunas cosas al PERL5LIB.
El problema con el que me encuentro es que /share/apps/install/bin
no se agrega a algunas instancias, por ejemplo, cosas llamadas desde un crontab.
Sé que puedo configurarlo manual y explícitamente PATH=/bin:/usr/bin:/blah/blah:...
dentro de mi crontab personal o dentro de cualquier script o entrada de crontab determinado, pero lo que espero es que haya una configuración en algún lugar fuera de /etc/profile
o /etc/bashrc
que coloque el .../bin
directorio no estándar en todas las RUTAS para todos los usuarios. .
Respuesta1
Agrega un archivo con el valor que deseas que PATH
tenga /etc/profile.d
. Estos archivos están configurados para ser obtenidos por shells como Bash, Csh Zsh o tcsh.
Ejemplo
Necesitábamos tener el siguiente valor agregado a nuestro PATH.
/usr/local/share/bin
Entonces creamos un archivo /etc/profile.d/ourstuff.sh
con la siguiente línea:
export PATH=/usr/local/share/bin:$PATH
Los archivos con la extensión .sh
provienen de shells como Bash y Zsh. Los archivos con la extensión .csh
provienen de Csh y tcsh.
EDITAR #1 - Seguimiento
OP hizo la siguiente pregunta de seguimiento.
Sí, pero ¿qué pasa con los trabajos cron? ¿Hay alguna manera de llegar hasta allí? cron no parece llamar a /etc/profile o /etc/bashrc.
A lo que respondí:
Correcto, no lo hace ni lo hará. Debe configurar el SHELL=/bin/bash
cron para anular el shell predeterminado (normalmente /bin/sh
). También puede configurar esto para los crons de usuario, BASH_ENV="$HOME/.bashrc", y esto para los crones del sistema BASH_ENV="/root/.bashrc"
. Sería una forma de evitar esto.
Le recomiendo encarecidamente que no haga esto. Deje que los scripts que necesitan un entorno específico lo configuren ellos mismos. ¡No intentes resolver todos los problemas a nivel global!
Respuesta2
Puede colocar definiciones de variables de entorno /etc/environment
(suponiendo que su sistema carguepam_env
para todos los servicios, que debería ser el valor predeterminado en todos los sistemas Linux modernos no integrados).
Tenga en cuenta que solo puede colocar definiciones de variables de entorno estáticas, del formato VARIABLE=VALUE
o VARIABLE="VALUE"
, con una definición por línea. No puedes tener comandos de shell arbitrarios, no puedes referirte al valor de otra variable escribiendo FOO=hello+$BAR
(eso pone un literal $
en el valor de FOO
), etc. Mientras te ciñas a asignaciones simples como PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin
, estarás bien. (tenga en cuenta que no puede utilizar el directorio de inicio del usuario allí: el valor debe ser el mismo para todos los usuarios).
Respuesta3
Lo que terminamos haciendo fue una solución múltiple para evitar problemas de ruta. Dependiendo del caso de uso, utilizamos uno o más de los siguientes:
- Se utilizaron rutas absolutas a los binarios instalados en lugares no estándar en lugar de esperar que el binario estuviera en la ruta. Esto se usó para herramientas que tienen pocas, o ninguna, dependencias externas no estándar y/o que funcionan de forma aislada.
- Creé y usé un script contenedor para una herramienta que configuró el entorno según fuera necesario; configurando manualmente
PATH=...
dentro de ese script y/o ejecutándolosource $HOME/.bashrc
según corresponda. Esto se usó para herramientas que necesitaban otras herramientas, pero que de otro modo podían ejecutarse en nuestro clúster. - Creé un contenedor (Docker en nuestro caso) que incluye los binarios y una configuración más compleja. Esto se utilizó para herramientas que requieren un entorno significativamente diferente de nuestra configuración de clúster estándar.