O serviço Systemd é executado sem sair

21

Eu criei meu próprio serviço para o jekyll e quando inicio o serviço, parece que ele não roda como um processo de segundo plano porque sou forçado a ctrl + c fora disso. Apenas fica em primeiro plano por causa do --watch. Não sei como contorná-lo e fazê-lo funcionar em segundo plano. Alguma idéia?

# /etc/systemd/system/jekyll-blog.service

[Unit]
Description=Start blog jekyll

[Service]
Type=forking
WorkingDirectory=/home/blog
ExecStart=/usr/local/bin/jekyll build --watch --incremental -s /home/blog -d /var/www/html/blog &
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
User=root
Group=root

[Install]
WantedBy=multi-user.target
    
por madmanali93 07.09.2016 / 02:11

1 resposta

38

O Systemd é capaz de lidar com vários tipos de serviços diferentes, especificamente um dos seguintes

  • simple - Um processo de longa execução que não se baseia em si mesmo e permanece ligado ao shell.
  • forking - Um daemon típico que se auto-separa do processo que o executou, efetivamente se autoiniciando.
  • oneshot - Um processo de curta duração que deve sair.
  • dbus - É simples, mas a notificação de acabamento de inicialização de processos é enviada pelo dbus.
  • notify - Como simples, mas a notificação de acabamento de inicialização de processos é enviada sobre inotify.
  • idle - Como simples, mas o binário é iniciado depois que o trabalho foi despachado.

No seu caso, você escolheu Type=forking , o que significa que o systemd está aguardando o processo se separar e o processo pai terminar, o que é uma indicação de que o processo foi iniciado com sucesso. No entanto, seu processo não está fazendo isso - ele permanece em primeiro plano e, portanto, systemctl start será interrompido indefinidamente ou até que o processo falhe.

Em vez disso, você deseja Type=simple , que é o padrão, para que você possa remover a linha completamente para obter o mesmo efeito. Nesse modo, o systemd não espera que os processos terminem de iniciar (já que não tem como saber quando isso aconteceu) e assim continua a execução e os serviços dependentes imediatamente. No seu caso não há nenhum, então isso não importa.

Uma pequena nota sobre segurança:

Você está executando o serviço como root, isso é desencorajado, pois é menos seguro do que executá-lo como um usuário não privilegiado. A razão para isto é que se existe uma vulnerabilidade no jekyll que de alguma forma permite a execução de comandos (possivelmente através do código que está analisando) então o atacante não precisa fazer mais nada para possuir completamente o seu sistema. Se, por outro lado, ele for executado como um usuário sem privilégios, o invasor só poderá causar o mesmo dano que aquele usuário e deverá agora tentar obter privilégios de root para possuir completamente o sistema. Ele simplesmente adiciona uma camada extra que os invasores devem usar.

Você pode simplesmente executá-lo como o mesmo usuário que está executando o seu servidor web, mas isso deixa você aberto a outro possível ataque. Se houver uma vulnerabilidade em seu servidor da Web que permita ao usuário manipular arquivos em seu sistema, eles poderão modificar os arquivos html gerados ou, pior, os arquivos de origem e fazer com que seu servidor forneça o que quiserem. No entanto, se os arquivos gerados e os arquivos de origem só puderem ser lidos pelo servidor da Web e graváveis como outro usuário não privilegiado, eles não poderão modificá-los com a mesma facilidade, atacando o servidor da Web.

No entanto, se você está simplesmente servindo arquivos estáticos deste servidor e mantém o servidor atualizado, esses ataques são muito pouco prováveis - mas ainda assim possíveis. É sua responsabilidade ponderar os riscos versus a sobrecarga de configurá-lo com base na importância do seu sistema, mas essas duas dicas são muito simples de configurar e quase nenhuma sobrecarga de manutenção.

    
por 07.09.2016 / 12:56

Tags