2010-07-07 31 views
14

Si ruby myapp.rb inicia la vista previa de sinatra en localhost: 4567, ¿cómo puedo detenerlo/parar/matar programáticamente? El comando de terminal (que no sea Ctrl-C) o las tareas de Rake estarían bien.cómo evitar que Sinatra se ejecute?

Necesito incorporar esto en una tarea o terminal Rake.

+15

Sinatra * Nunca * ejecuta. Sus botas están hechas para * caminar ... * – Shog9

Respuesta

19

En myapp.rb, añadir este antes de que comience Sinatra:

puts "This is process #{Process.pid}" 

Cuando se quiere acabar con él, hacer esto en un shell:

kill <pid> 

Dónde <pid> es el número que salen de miaplicacion .rb. Si desea hacerlo en ruby:

Process.kill 'TERM', <pid> 

Ambos permitirán que sinatra ejecute su rutina de salida. Si no desea escribir el pid cada vez, haga que myapp.rb abra un archivo y lo incluya en él. Luego, cuando quieras detenerlo, lee el archivo y úsalo. Ejemplo:

# myapp.rb: 
File.open('myapp.pid', 'w') {|f| f.write Process.pid } 

# shell: 
kill `cat myapp.pid` 

# ruby: 
Process.kill 'TERM', File.read('myapp.pid') 
+2

Gracias, especialmente por el último código - que estoy usando. Necesitaba convertir a int para 'Process.kill 'TERM', File.read ('myapp.pid'). To_i' –

12

En OS X, desde la línea de comandos (Terminal.app, o DTERM) introduce:

$ killall ruby 

cada proceso de rubí se detendrá. Sinatra también.

En Linux (y otros Unix), se puede:

$ ps aux | grep ruby 
$ kill <ruby-process-id> 
+1

' killall ruby' también funciona en Linux –

0

La forma más simples de hacer eso:

kill #{Process.pid} 
0

Para hacer esto de una manera repetible sencilla, hay algunos métodos.

  1. Registre el PID al iniciar su servidor Sinatra, p.

    # Run the Sinatra server and send it to background (using &) 
    ruby my_sinatra_server.rb & 
    
    # Record the PID of the last background process (using $!) 
    MY_SINATRA_SERVER_PID=$! 
    
    # Now go ahead and do your stuff... 
    
    # When finished, kill the sinatra server (from the same shell) 
    kill $MY_SINATRA_SERVER_PID 
    
  2. En lugar de utilizar una variable de entorno ($MY_SINATRA_SERVER) se puede utilizar un archivo temporal, por ejemplo, my_sinatra_server.pid

    # Run the Sinatra server and send it to background (using &) 
    ruby my_sinatra_server.rb & 
    
    # Record the PID of the last background process (using $!) 
    echo $! > my_sinatra_server.pid 
    
    # Now go ahead and do your stuff... 
    
    # When finished, kill the sinatra server (from the same shell) 
    kill $(< my_sinatra_server.pid) 
    
Cuestiones relacionadas