web-dev-qa-db-fra.com

Exécuter un service systemd en tant qu'utilisateur autre que root!

J'ai créé le service suivant, amos.service, et il doit s'exécuter en tant qu'amos (membre du groupe amos)

[Unit]
Description=AMOS Service
After=network.target

[Service]
User=amos
Group=amos
Type=simple
WorkingDirectory=/usr/share/amos
ExecStart=/usr/share/amos/amos_service.sh start
ExecStop=/usr/share/amos/amos_service.sh stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

toutes les autorisations ont été définies sur /usr/share/amos à amos:amos

amos_service.sh est le suivant:

#!/bin/bash

CUDIR=$(dirname "$0")
cd /usr/share/amos

start() {
  exec /usr/share/amos/run_amos.sh >> /var/log/amos.log 2>&1  
}

stop() {
  exec pkill Java 
}

case $1 in
  start|stop) "$1" ;;
esac

cd "$CURDIR"

Lorsque j'exécute le service initialement sans aucune modification des répertoires, c'est-à-dire, appartenant à root et amos.service n'ayant pas le paramètre User not Group, tout fonctionne très bien!

Une fois que j'ai changé les autorisations des répertoires en amos: amos et ajouté l'utilisateur et le groupe amos.service, le serive ne fonctionnera pas et j'obtiens ce qui suit: Voir l'image jointe

Error after trying to run service

22
itprguy

Utilisez systemd:

Pour afficher le problème, utilisez journalctl -xe après avoir démarré le service.

Vous n'avez pas besoin d'un script bash, mettez-le dans votre fichier de service:

ExecStart=/usr/share/amos/run_amos.sh

Il n'y a pas besoin de ExecStop, systemd arrêtera tous les processus enfants. Vous pouvez afficher la sortie avec journalctl -u amos.service.

12
ctx

Je pense que vous voulez bifurquer plutôt que simple. Simple suppose que votre processus ne se termine pas, donc quand il le fait, il appelle le processus mort.

Vous voudrez probablement supprimer le script amos_service.sh et mettre ses fonctionnalités dans amos.service.

6
pileofrogs