web-dev-qa-db-fra.com

Comment ajouter ~ / bin à PATH pour un service systemd?

J'ai un service systemd qui appelle un script PHP qui crée une session tmux au démarrage.

Globalement, j'ai le tmux le plus récent pour la distribution (V> = 2.5).
Le script USER a un $HOME/bin/tmux de 2.0

Ce dont j'ai besoin, c'est que systemd utilise le binaire tmux dans $ HOME de l'utilisateur.
J'ai défini les variables USER & GROUP dans le fichier de service systemd, mais il semble appeler le fichier binaire installé globalement.

Est-il possible de définir explicitement le binaire à appeler pour cette invocation de service?

Si possible, je préférerais ne pas commencer à coder le chemin dans le fichier PHP.

Merci beaucoup.

5
Mark

Cela semble terriblement bidouilliste, mais la préparation d’une mise à jour $PATH semble fonctionner.
Je suis toutefois à l'affût des effets secondaires. . .

Exemple:

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

Vous pouvez coder en dur le PATH dans le service systemd:

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

PAM serait plus flexible. C'est terriblement détourné comparé à simplement utiliser bash -c '....', mais vous pouvez le faire avec PAM.

Créez une nouvelle configuration PAM dans /etc/pam.d (disons /etc/pam.d/foo) et ajoutez:

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

Et dans /home/someUser/some-file, ajoutez:

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

Bien sûr, vous pouvez ajuster le nom some-file sur quelque chose de plus raisonnable, mais le chemin dans user_envfile doit être relatif au répertoire de base de l'utilisateur (l'utilisateur que vous avez défini dans User= dans le service).

Ensuite, dans le fichier de service, dans la section [Service], ajoutez (foo étant le fichier dans /etc/pam.d créé précédemment):

PAMName=foo

Maintenant, lorsque vous démarrez le service (après le rechargement, etc.), les modules session de /etc/pam.d/foo seront exécutés, ce qui dans ce cas est simplement pam_env . pam_env chargera les variables d'environnement depuis /etc/environment, sous réserve des contraintes définies dans /etc/security/pam_env.conf, puis de l'environnement utilisateur depuis ~/some-file. Puisque PATH est défini sur une valeur par défaut dans /etc/environment, l'environnement utilisateur est ajouté à cette valeur par défaut.

Ici, la valeur par défaut de user_envfile est .pam_environment, qui est également lue par la configuration PAM de choses telles que la connexion SSH ou LightDM, etc. J'ai utilisé un fichier différent ici au cas où vous ne voudriez pas affecter ces choses. Vous pouvez supprimer le user_envfile=... et utiliser le ~/.pam_environment par défaut. vous pouvez également simplement utiliser une configuration PAM existante dans /etc/pam.d qui a user_readenv=1, mais d'autres modules PAM peuvent provoquer des effets secondaires indésirables.

4
muru

Dans un service que je configurais (Apache Airflow), je disposais d'un ensemble de fichiers d'environnement.

Dans mon fichier /etc/systemd/system/airflow, j'avais cette ligne:

[Service]
EnvironmentFile=/etc/default/airflow

En ouvrant ce fichier d'environnement, j'ai ajouté la ligne dont j'avais besoin, dans mon cas:

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

Ajoutez tous les chemins d'accès aux exécutables dont vous avez besoin pour pouvoir être contactés par le service ici et tout devrait bien se passer. A bien fonctionné pour moi.

1
Pandakaebi