2010-07-07 71 views
14

如果ruby myapp.rb在localhost:4567啓動sinatra預覽,我該如何以編程方式停止/暫停/殺死它?終端命令(Ctrl-C除外)或Rake任務都可以。如何阻止sinatra運行?

我需要將其納入Rake任務或終端。

+15

西納特拉*從未*運行。她的靴子是爲*行走而設計的。* – Shog9 2010-07-07 17:34:34

回答

19

在myapp.rb,添加此西納特拉開始之前:

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

當你想殺死它,在外殼做到這一點:

kill <pid> 

<pid>的數量由MYAPP輸出.RB。如果你想用紅寶石做:

Process.kill 'TERM', <pid> 

這兩個都會讓sinatra運行它的退出程序。如果您不想每次都輸入pid,請讓myapp.rb打開一個文件並將其放入pid中。然後,當你想停止它時,閱讀文件並使用它。例如:

# 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

謝謝,尤其是最後一段代碼 - 我正在使用它。我需要爲'Process.kill'TERM',File.read('myapp.pid')。to_i'轉換爲int – 2010-07-08 00:49:33

12

在OS X,從命令行(Terminal.app,或DTERM)只需輸入:

$ killall ruby 

每紅寶石過程將停止。西納特拉也是。

在Linux(和其他UNIX系統),您可以:

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

'killall ruby​​'也可以在Linux中運行 – 2015-06-20 16:41:06

0

的simples辦法做到這一點:

kill #{Process.pid} 
0

以簡單重複的方式做到這一點,有幾個方法。

  1. 記錄啓動Sinatra服務器時的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 $!) 
    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. 代替使用環境變量($MY_SINATRA_SERVER)的就可以例如使用一個臨時文件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)