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.
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"
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.
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.