Existe algum utilitário para daemonização de processos como usuário não privilegiado?

6

Uma coisa que eu frequentemente quero fazer é lançar algum processo ou servidor de longa duração como meu próprio usuário não privilegiado e, em seguida, ter uma maneira de saber se ele ainda está em execução e reiniciá-lo.

Então, por exemplo, eu posso definir um cron job que seja executado de vez em quando, verificando se o processo está em execução e reiniciá-lo se ele tiver falhado. Esta é a essência das ferramentas de gerenciamento de processos como daemontools, supervisord, launchd etc. do djb, exceto que essas ferramentas são configuradas por padrão para executar como root com arquivos de configuração em /etc , mas eu gostaria de um utilitário que me permite fazer o mesmo tipo de coisa como meu usuário não privilegiado no conforto do meu diretório home.

    
por Chris McCormick 19.08.2016 / 11:06

4 respostas

3

deamontools que você mencionou funciona muito bem como usuário. Consulte o link

Atualização - soluções

de acordo com a sugestão acima, o OP conseguiu trabalhar usando o programa svscan de daemontools depois de tentar dois métodos diferentes:

  1. Coloque assim um crontab moderno: @reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
  2. Crie ~/.config/autostart/svscan.desktop com a linha Exec=... definida para lançar svscan com um script de wrapper. Meu script de wrapper é assim:

    #!/usr/bin/env sh
    (
      echo "Starting svscan."
      date
      /usr/bin/svscan $HOME/.local/service 2>&1
    ) >> $HOME/.local/service/log
    

Ambos os métodos funcionam, mas cada um é bom para uma situação diferente. A primeira maneira é boa se você estiver fazendo isso em uma máquina sem cabeçalho, onde você deseja permitir que um usuário não privilegiado instale seus próprios serviços e processos de longa duração. A segunda maneira é boa se você quiser que todos os serviços herdem o ambiente, ssh-agent, etc. de seu usuário X atualmente conectado, o que significa que os processos efetivamente se tornam um proxy do usuário atualmente logado.

    
por 19.08.2016 / 13:25
3

Usando systemd:

1. Crie um arquivo de configuração da unidade de serviço

~ / .config / systemd / user / < service_name > .service

[Unit]
Description=<Write some description here>

[Service]
ExecStart=<Write some command here>
Restart=always

[Install]
WantedBy=graphical.target

Consulte man systemd.service e man systemd.unit para mais opções.

2. Ativar serviço no espaço do usuário

$ systemctl --user enable <service_name>

3. Comece imediatamente e verifique seu status

$ systemctl --user start <service_name>
$ systemctl --user status <service_name>

4. Certifique-se de que inicia automaticamente

Agora você pode recarregar o PC e fazer login no seu ambiente gráfico e, em seguida, verificar o status do serviço novamente.

5. Aproveite!

    
por 29.04.2017 / 00:20
2

Se o seu servidor executar o systemd, você poderá executar serviços no espaço do usuário com systemd --user start myservice . Os arquivos de serviço devem ser colocados em ~/.config/systemd/user/ .

Se você configurar a opção Restart desse serviço, O systemd reiniciará automaticamente esse serviço quando sair (com diferentes opções de configuração).

Outra opção independente do systemd pode começar por screen . Você pode verificar se existe uma sessão de tela chamando screen -list e iniciar, se necessário (desanexado). Você pode "remotamente" executar comandos na tela com screen -S "$screen_session" -X stuff 'command\n' . Você simplesmente iniciaria o programa em segundo plano nessa sessão de tela e lembraria do PID em uma variável.

A tarefa cron usa o comando stuff da tela para verificar se o processo ainda está em execução e, caso contrário, será reiniciado.

    
por 19.08.2016 / 11:42
1

Nos sistemas Debian, você pode usar start-stop-daemon de maneira semelhante à usada pelos scripts de inicialização. Para daemonizing (double fork) e salvar PID, não são necessários privilégios adicionais (no entanto, se você tentar usar qualquer opção que os exija, a execução do programa como usuário não privilegiado falhará).

Para iniciar o seu processo de longa duração:

/sbin/start-stop-daemon --start --pidfile /path/to/pidfile --make-pidfile \
                        --background --exec /path/to/executable -- options

Verifique o status:

/sbin/start-stop-daemon --status --pidfile /path/to/pidfile

Pare o processo:

/sbin/start-stop-daemon --stop --pidfile /path/to/pidfile
    
por 20.12.2017 / 19:31