Executando um serviço systemd como um usuário que não seja root!

18

Criei o seguinte serviço, amos.service, e ele precisa ser executado como amos (membro do 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

todas as permissões foram definidas /usr/share/amosparaamos:amos

o amos_service.sh é o seguinte:

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

Quando eu executo o serviço inicialmente sem nenhuma modificação nos diretórios, ou seja, pertencente ao root e amos.service, sem o parâmetro User not Group, tudo funciona muito bem!

Depois de alterar as permissões dos diretórios para amos: amos e adicionar o usuário e grupo amos.service, o serviço não funcionará e recebo o seguinte: Veja a imagem em anexo

Erro após tentar executar o serviço

itprguy
fonte
Qual é a diferença, se houver, entre os casos de sucesso e falha em termos das mensagens registradas em /var/log/amos.log?
sourcejedi 4/17/17
Além disso, essa configuração é estranha, pois /var/logpertence à raiz. Eu acho que você deseja usar um diretório /var/log/amos/que você cria como de propriedade de amos.
sourcejedi
Criarei

Respostas:

11

Use systemd:

Para mostrar o problema, use journalctl -xedepois de iniciar o serviço.

Você não precisa de um script bash, coloque isso no seu arquivo de serviço:

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

Não há necessidade ExecStop, o systemd interromperá todos os processos filhos. Você pode ver a saída com journalctl -u amos.service.

ctx
fonte
4
Deve haver um "=" após o ExecStart. Não consigo corrigi-lo porque a edição teria menos de 6 caracteres.
Mark Stosberg
5

Eu acho que você quer garfos em vez de simples. Simples pressupõe que seu processo não é encerrado; portanto, quando ocorre, o processo é encerrado.

Você provavelmente deseja remover o script amos_service.sh e colocá-lo em funcionalidade no amos.service.

stackofrogs
fonte
Fará alterações conforme sugerido ... estava lendo sobre isso e viu seu comentário. Registrará novamente os resultados.
Itprguy