2010-07-07 4 views
14

Si ruby myapp.rb commence la prévisualisation de sinatra à l'adresse localhost: 4567, comment puis-je l'arrêter/l'arrêter par programmation? La commande de terminal (autre que Ctrl-C), ou les tâches de Rake seraient bien.comment arrêter sinatra de fonctionner?

J'ai besoin de l'incorporer dans une tâche ou un terminal Rake.

+15

sinatra * jamais * courses. Ses bottes sont faites pour * marcher ... * – Shog9

Répondre

19

Dans myapp.rb, ajoutez ceci avant sinatra commence:

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

Lorsque vous voulez tuer, faites-en une coquille:

kill <pid> 

<pid> est le numéro par monapp émis en sortie .rb. Si vous voulez le faire en ruby:

Process.kill 'TERM', <pid> 

Ces deux options permettront à Sinatra de fonctionner comme une routine de sortie. Si vous ne voulez pas entrer le pid à chaque fois, myapp.rb ouvre un fichier et le met dans pid. Ensuite, lorsque vous voulez l'arrêter, lisez le fichier et utilisez-le. Exemple:

# 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

Merci, surtout pour le dernier code - que j'utilise. J'avais besoin de convertir en int pour 'Process.kill 'TERM', File.read ('myapp.pid'). To_i' –

12

Dans OS X, à partir de la ligne de commande (Terminal.app ou DTerm) il suffit d'entrer:

$ killall ruby 

tous les processus rubis arrêtera. Sinatra aussi.

Dans Linux (et d'autres unix), vous pouvez:

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

' killall ruby' fonctionne aussi sous Linux –

0

La façon de simples à faire:

kill #{Process.pid} 
0

Pour ce faire, d'une manière simple reproductible, il y a quelques méthodes.

  1. Enregistrez le PID au démarrage de votre serveur Sinatra, par ex.

    # 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. Au lieu d'utiliser une variable d'env ($MY_SINATRA_SERVER), vous pouvez utiliser un fichier temporaire par exemple 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)