Como faço meu serviço systemd ser executado por um usuário específico e inicio na inicialização?

69

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

Aqui está o meu script anterior:

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

Baseado no upstart na página wiki do systemd , usei as tabelas fornecidas para mapear as coisas o mais próximo que pude novo arquivo de serviço do 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 faço logout 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. Eu quero que ele se comporte da mesma forma que um serviço iniciante: Eu quero que ele comece na inicialização, seja executado constantemente e como um usuário específico.

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

    
por void.pointer 19.09.2015 / 18:17

2 respostas

88

Primeiro problema

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

Segundo problema

Para que o serviço seja executado na inicialização, você não deve colocá-lo na sua pasta pessoal. Em vez disso, coloque-o em /etc/systemd/system/ . Esta é 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 unitários, embora no Debian e no Ubuntu a pasta seja /lib/systemd/system/ , porque as várias pastas bin e lib ainda não foram mescladas em um prefixo /usr/ 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, você pode tentar iniciar a unidade imediatamente digitando systemctl start <UNIT_FILENAME> como de costume. Deve funcionar sem ter que digitar o caminho completo da unidade. A extensão também não precisa ser especificada se for .service .

Ativando a unidade

Antes de poder ativar sua unidade, você precisa adicionar uma seção [Install] , sob a 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.

Uma vez que essa informação é adicionada, você pode usar systemctl enable <UNIT_FILENAME> , que ativa a unidade, fazendo com que o systemd a partir de agora a inicie automaticamente durante a inicialização no estágio especificado.

    
por Yamaho 19.09.2015 / 18:51
25

Você pode estar interessado em usar a funcionalidade "user lingering" 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 em ~/.config/systemd/user sejam selecionadas e processadas nos horários de inicialização e desligamento de acordo com a configuração do serviço.

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

    
por byteborg 11.12.2016 / 21:28

Tags