¡Ejecutar un servicio systemd como un usuario que no sea root!

18

Creé el siguiente servicio, amos.service, y necesita ejecutarse como amos (miembro del grupo 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

todos los permisos se han fijado en /usr/share/amosaamos:amos

amos_service.sh es el siguiente:

#!/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"

Cuando ejecuto el servicio inicialmente sin ninguna modificación en los directorios, es decir, perteneciente a root, y amos.service no tiene el parámetro Usuario no Grupo, ¡todo funciona muy bien!

Una vez que cambie los permisos de los directorios a amos: amos y agregue el usuario y grupo amos.service, el servidor no funcionará y obtengo lo siguiente: Ver imagen adjunta

Error después de intentar ejecutar el servicio

itprguy
fuente
¿Cuál es la diferencia, si la hay, entre los casos de éxito y fracaso en términos de los mensajes registrados en /var/log/amos.log?
sourcejedi
Además, esta configuración es extraña ya que /var/loges propiedad de root. Creo que desea utilizar un directorio /var/log/amos/que cree como propiedad de amos.
sourcejedi
Crearé lo

Respuestas:

11

Utilice systemd:

Para mostrar el problema, use journalctl -xedespués de iniciar el servicio.

No necesita un script bash, ponga esto en su archivo de servicio:

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

No es necesario ExecStop, systemd detendrá todos los procesos secundarios. Puede ver la salida con journalctl -u amos.service.

ctx
fuente
44
Debe haber un "=" después de ExecStart. No puedo solucionarlo porque la edición tendría menos de 6 caracteres.
Mark Stosberg
5

Creo que quieres bifurcar en lugar de simple. Simple asume que su proceso no sale, por lo que cuando lo hace, lo llama muerto.

Probablemente desee eliminar el script amos_service.sh y poner su funcionalidad en el amos.service.

pila de ranas
fuente
Hará los cambios según lo sugerido ... estaba leyendo al respecto y vi su comentario. Regresará los resultados.
itprguy