Como faço para que meu serviço systemd seja executado por um usuário específico e inicie na inicialização?


133

Acabei de atualizar do servidor Ubuntu 14 para a versão 15. Eu tive problemas para fazer meu script inicial funcionar após a atualização e li que systemd é o novo padrão. Estou longe de ser um especialista em linux, então por favor, vá com calma comigo :-)

Aqui está o que meu script inicial era antes:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Com base na página inicial do wiki do systemd , usei as tabelas fornecidas lá para mapear as coisas o mais próximo possível do meu novo arquivo de serviço systemd:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Este arquivo está localizado em /home/robert/.config/systemd/user/nzbget.service. Para iniciar o serviço manualmente, eu tenho feito:

$ systemctl --user start nzbget

Isso funciona muito bem. No entanto, quando eu saio da minha sessão SSH, o serviço é encerrado. Além disso, ele não inicia na inicialização ou no login do usuário. Quero que ele se comporte da mesma forma que um serviço inicial: quero que ele inicie na inicialização, execute constantemente e como um usuário específico.

O que preciso fazer para obter essa configuração?

Respostas:


164

Primeiro problema

Você pode especificar as diretivas User=e Group=na [Service]seção do arquivo da unidade.

Segundo problema

Para executar o serviço na inicialização, você não deve colocá-lo na sua pasta pessoal. Em vez disso, coloque-o em baixo /etc/systemd/system/. Essa é a pasta que deve ser usada pelo administrador do sistema (ou seja, você) para adicionar novos serviços em todo o sistema.

Outras pastas incluem:

  • /usr/lib/systemd/system/é destinado a pacotes que desejam instalar arquivos de unidade, embora no Debian e no Ubuntu a pasta seja realmente /lib/systemd/system/porque as várias pastas bine libainda não foram mescladas em um /usr/prefixo unificado .
  • /usr/local/systemd/system/ é para instalar unidades por pacotes compilados localmente.

Testando a unidade

Quando o arquivo da unidade estiver em um local apropriado, tente iniciar a unidade imediatamente, digitando systemctl start <UNIT_FILENAME>como de costume. Deve funcionar sem precisar digitar o caminho completo da unidade. A extensão também não precisa ser especificada, se for .service.

Ativando a unidade

Antes de habilitar sua unidade, você precisa adicionar uma [Install]seção, na qual você deve adicionar a diretiva WantedBy=multi-user.target. Esta diretiva especifica o estágio do processo de inicialização durante o qual o serviço deve ser iniciado (se estiver ativado). multi-user.targeté apropriado para a maioria dos serviços.

Depois que essas informações são adicionadas, você pode usar o systemctl enable <UNIT_FILENAME>que habilita a unidade, fazendo com que o systemd a partir de agora a inicie automaticamente durante a inicialização no estágio especificado.


Isso funcionou. Eu tive que especificar o caminho absoluto para o nome do arquivo de serviço no systemctl enablecomando, porém, isso não era óbvio para mim no começo. A ativação também me deu algum aviso sobre uma [Install]seção ausente . Eu o ignorei, mas não tenho certeza se isso afetará sua capacidade de iniciar no momento da inicialização.
precisa saber é o seguinte

2
O Installaviso foi realmente muito importante. Não será iniciado na inicialização sem WantedBy=multi-user.targeta [Install]seção. Depois de adicionar isso para o .servicearquivo, em seguida, você pode enable-lo.
void.pointer

4
Peço desculpas por deixar a resposta desacompanhada por tanto tempo. Corrigi o local onde o arquivo da unidade deveria ir, adicionei as informações ausentes sobre a [Install]seção. Espero que agora seja mais útil para quem procura.
Yamaho

5
Isto torna-se muito mais fácil quando o nome de usuário é de modelo, ou seja, o seu serviço é definido com um nome de arquivo no formato something@.service, em seguida, enablegostaria something@username.servicea configuração torna-se User=%io que significa que o usuário não está codificado e vários usuários podem usar a mesma definição. Um exemplo.
Walf

1
Será que vai começar se eu colocá-lo sob /etc/systemd/user/?
Khurshid Alam

46

Você pode estar interessado em usar a funcionalidade "persistente do usuário" do systemd. Está ativado via loginctl enable-linger USERNAME.

Isso faz com que um gerenciador de serviços separado para o respectivo usuário seja iniciado na inicialização, para que suas unidades definidas pelo usuário ~/.config/systemd/usersejam selecionadas e processadas nos momentos de inicialização e desligamento, de acordo com a configuração do serviço.

Você também pode usar systemctl --userpara gerenciar e configurar o (s) serviço (s), que operará no gerenciador de serviço do usuário, não no do sistema.


6
systemctl --useré uma descoberta fantástica. Obrigado!
Anwar

@byteborg Talvez você possa contribuir para unix.stackexchange.com/questions/409900/… ? Preciso de dependência do PostgreSQL no serviço persistente do usuário, mas o banco de dados permanece como serviço do sistema, não do usuário.
Michał F

1
Depois que os serviços estão sendo executados, existem técnicas que podem permitir que o usuário veja os logs do serviço? Um usuário sem privilégios não seria capaz de acessar / var / log / syslog.
Mpr

2
Observe que, systemctl --userembora não pareça funcionar para sessões SSH.
Mark K Cowan

2
Deve ser a solução aceita
Drew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.