falha ao iniciar o serviço

15

Eu criei um serviço systemd:

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mine.service

Coloquei-o na pasta / etc / systemd / system e o nomeei como meu.service.

Se eu correr, sudo service mine startisso me dá:

Falha ao iniciar mine.service.Unit mine.service não encontrado

--- ATUALIZAÇÃO -----

Eu corro primeiro sudo systemctl daemon-reloade agora ele não me envia nenhuma mensagem, mas o serviço ainda não é iniciado.

George
fonte
10
Você já executou systemctl daemon-reloadapós criar seu arquivo de unidade?
Wieland
@Wieland: Hmm .. Agora ele não me mostra nenhuma mensagem. Mas ainda não é iniciado.
George George
@don_crissti: O status diz que está ativo, mas o script (no ExecStart) não é executado.
George George
como saberia o $ HOME adequado? O que você espera que seja para um serviço do sistema?
Serge
@ Emerge: Hmm..Então, como posso usar $ HOME?
George George

Respostas:

14

$HOMEaponta para o diretório inicial do usuário que está executando o script. Os serviços Systemd são iniciados com o root, provavelmente tentando /root/theFolder/run.sh. Use caminhos absolutos nos arquivos de serviço.

Você também tem a forkingopção definida. Isso é necessário para um programa que se destaca, o seu script faz isso? A maioria não, e se o seu não, você deve remover essa opção ou o systemd estará aguardando o término do script para reivindicá-lo como iniciado.

Também os arquivos de serviço do sistema que apontam para scripts no diretório inicial são desencorajados e, possivelmente, uma preocupação de segurança. Como eles são executados como root, qualquer pessoa que possa modificá-los pode obter acesso root ao seu computador. É muito melhor copiar o script /usr/local/bine garantir que ele seja de propriedade e somente gravável pela raiz para interromper isso. Também é uma boa ideia executar o script como um usuário sem privilégios usando as opções User=e Group=no arquivo de serviço.

Se você deseja executá-lo como seu usuário, é melhor colocar o arquivo de serviço ~/.config/systemd/user/e iniciá-lo / ativá-lo systemctl --user enable yourservice && systemctl --user start yourservice(observe, execute como seu usuário não root). Veja isso para obter mais informações sobre arquivos de serviço do usuário.

Michael Daffin
fonte
: Eu coloquei o script em / usr / local / bin e o serviço em /.config/systemd/user.Se eu tentar habilitar o serviço, ele me mostra "argumentos em excesso" .Se eu tentar usar systemctl, ele mostra 'falhou .. unit .. ', algo parecido com isto.
George
Você pode fornecer os comandos completos que tentou e logs mais detalhados. É difícil depurar com fragmentos.
Michael Daffin
: Existe uma solução para usar o caminho $ HOME? Porque, se eu colocar o script em / usr / local / bin, ele usará caminhos relativos para $ HOME.Eu vi isso .E tentei colocar HOME=$HOMEno primeiro arquivo de ambiente. Mas o serviço não pôde ser iniciado, sem erros.
George
1
no ubuntu Eu tive que usar systemctl para isso não systemd, usando systemd eu tenho um erro "Argumentos em excesso"
Alexander Mills
1
@AlexanderMills Você está certo, o comando correto no systemctl e systemd foi apenas um erro de digitação na resposta.
Michael Daffin