如果ruby myapp.rb
在localhost:4567开始sinatra预览,我怎么能以编程方式停止/停止/杀死它?终端命令(除了Ctrl-C)或Rake任务都没问题。
我需要将其纳入Rake任务或终端。
答案 0 :(得分:21)
在myapp.rb中,在sinatra开始之前添加:
puts "This is process #{Process.pid}"
如果要杀死它,请在shell中执行此操作:
kill <pid>
其中<pid>
是myapp.rb输出的数字。如果你想在ruby中这样做:
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')
答案 1 :(得分:13)
在OS X中,只需输入命令行(Terminal.app或DTerm):
$ killall ruby
每个红宝石过程都会停止。 Sinatra也是。
在Linux(和其他UNIX)中,您可以:
$ ps aux | grep ruby
$ kill <ruby-process-id>
答案 2 :(得分:0)
这样做的简单方法:
kill #{Process.pid}
答案 3 :(得分:0)
要以简单的可重复方式执行此操作,有几种方法。
在启动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
您可以使用临时文件,例如,不使用env变量($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)