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 .
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
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 .
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"