Ubuntu: el script Ruby Daemon crea dos procesos: sh y ruby: el archivo PID apunta a sh, no a ruby

2

El archivo PID para un proceso de ruby ​​que estoy ejecutando como demonio está recibiendo el PID incorrecto. Parece que la ejecución /etc/init.d/sinatra startse crean dos procesos - shy ruby, y el PID que termina en el archivo PID es el del shproceso. Esto significa que cuando ejecuto /etc/init.d/sinatra stopo /etc/init.d/sinatra restart, está matando sh y dejando el proceso de ruby ​​todavía ejecutándose.

Me gustaría saber a) por qué mi script inicia dos procesos: sh y ruby, y no solo ruby, y b) ¿cómo lo soluciono para simplemente iniciar ruby?

Detalles de la configuración:

Tengo un pequeño servidor Sinatra configurado en un servidor ubuntu, que se ejecuta como un demonio. Se establece en forma automática al arrancar el servidor ejecutar un script llamado sinatraen /etc/init.dla que se lanza el script de un control control.rb, que luego se ejecuta un comando de rubí daemon para iniciar el servidor. El script se ejecuta bajo la cuenta 'sinatrauser', que tiene permisos para los directorios que necesita el script.

contenido de /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 este script, simplemente lo copié /etc/init.d/y ejecuté sudo update-rc.d sinatra defaults

contenido de /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

porción de salida de 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

El archivo PID se crea /opt/pids/sinatra/sinatraserver.rb.pidy siempre contiene el PID de la instancia sh, que siempre es uno menos que el PID del proceso ruby

EDITAR: probé la solución de micke, pero no tuvo ningún efecto en el comportamiento que estoy viendo.

Esta es la salida de ps -A f. Este resultado se ve igual si uso sudo -u sinatrauser ...o su sinatrauser -c ...en el script de inicio del servicio en /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
Jonathan Scoles
fuente

Respuestas:

1

La forma de ejecutivo que está utilizando es la causa de esto. Si separa el comando de los parámetros, evitará crear un shell. Vea este problema de github para alguien que soluciona un problema similar: https://github.com/sunspot/sunspot/pull/221 .

Ryan Wallace
fuente
1

El primer proceso es sudo que lanza ruby. Consulte con ps -A f. Cambie la línea sudo para ejecutar un comando.

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

editar : Creo que su se ve más ordenado en los scripts, así:

    su - someuser <<CHBACK
    ls $HOME // do stuff
    echo "do more stuff as $USER"
    CHBACK
    echo "Now I'm $USER again"
micke
fuente