Ubuntu - O script Ruby Daemon cria dois processos - sh e ruby - pontos de arquivo PID em sh, não em ruby

2

O arquivo PID para um processo ruby que estou executando como um daemon está recebendo o PID incorreto. Parece que executar /etc/init.d/sinatra start cria dois processos - sh e ruby , e o PID que acaba no arquivo PID é aquele do processo sh . Isso significa que quando eu executar /etc/init.d/sinatra stop ou /etc/init.d/sinatra restart , ele estará matando sh e deixando o processo ruby ainda em execução.

Eu gostaria de saber a) por que meu script está lançando dois processos - sh e ruby, e não apenas ruby, e b) como faço para corrigi-lo apenas para iniciar o ruby?

Detalhes da configuração:

Eu tenho um pequeno servidor Sinatra configurado em um servidor Ubuntu, rodando como um daemon. Ele é configurado para iniciar automaticamente na inicialização do servidor um script chamado sinatra in /etc/init.d que inicia o script de controle control.rb , que então executa um comando daemon ruby para iniciar o servidor. O script é executado sob a conta 'sinatrauser', que tem permissões para os diretórios que o script precisa.

conteúdo do /etc/init.d/sinatra

#!/bin/bash
# sinatra      Startup script for Sinatra server.

sudo -u sinatrauser ruby /var/www/sinatra/control.rb $1
RETVAL=$?

exit $RETVAL

Para instalar esse script, simplesmente copiei para /etc/init.d/ e executei sudo update-rc.d sinatra defaults

conteúdo do /var/www/sinatra/control.rb

require 'rubygems'
require 'daemons'

pwd = Dir.pwd
Daemons.run_proc('sinatraserver.rb', {:dir_mode => :normal, :dir => "/opt/pids/sinatra"}) do
  Dir.chdir(pwd)
  exec 'ruby /var/www/sinatra/sintraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1'
end

parte da saída do ps -A

6967 ?         00:00:00 apache2
10181 ?        00:00:00 sh       <--- PID file gets this PID
10182 ?        00:00:02 ruby     <--- Actual ruby process running Sinatra
12172 ?        00:00:00 sshd

O arquivo PID é criado em /opt/pids/sinatra/sinatraserver.rb.pid e sempre contém o PID da instância sh, que é sempre um a menos que o PID do processo ruby

EDITAR: Eu tentei a solução de Micke, mas não teve efeito sobre o comportamento que estou vendo.

Esta é a saída de ps -A f . Essa saída parece a mesma se eu uso sudo -u sinatrauser ... ou su sinatrauser -c ... no script de início de serviço em /etc/init.d.

1146 ?        S      0:00 sh -c ruby /var/www/sinatra/sinatraserver.rb >> /var/log/sinatra/sinatraOutput.log 2>&1
1147 ?        S      0:00  \_ ruby /var/www/sinatra/sinatraserver.rb
    
por Jonathan Scoles 14.10.2011 / 20:32

2 respostas

1

A forma de exec que você está usando é a causa disso. Se você separar o comando dos parâmetros, evitará a criação de um shell. Veja este problema no github para alguém corrigir um problema semelhante: link .

    
por 22.06.2012 / 09:20
1

O primeiro processo é o sudo que lança ruby. Verifique com ps -A f . Altere a linha sudo para executar um comando.

su sinatrauser -c "ruby /var/www/sinatra/control.rb $1"

editar : Acho que o su parece mais simples em scripts, assim:

    su - someuser <<CHBACK
    ls $HOME // do stuff
    echo "do more stuff as $USER"
    CHBACK
    echo "Now I'm $USER again"
    
por 15.10.2011 / 22:34