【发布时间】:2017-11-11 17:39:42
【问题描述】:
如果ruby myapp.rb 在 localhost:4567 开始 sinatra 预览,我如何以编程方式停止/停止/杀死它?终端命令(Ctrl-C 除外)或 Rake 任务都可以。
我需要将其合并到 Rake 任务或终端中。
【问题讨论】:
-
sinatra 从不运行。她的靴子是为步行而设计的......
如果ruby myapp.rb 在 localhost:4567 开始 sinatra 预览,我如何以编程方式停止/停止/杀死它?终端命令(Ctrl-C 除外)或 Rake 任务都可以。
我需要将其合并到 Rake 任务或终端中。
【问题讨论】:
在 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')
【讨论】:
Process.kill 'TERM', File.read('myapp.pid').to_i 转换为 int
在 OS X 中,从命令行(Terminal.app 或 DTerm)只需输入:
$ killall ruby
每个 ruby 进程都会停止。西纳特拉也是。
在 Linux(和其他 UNIX)中,您可以:
$ ps aux | grep ruby
$ kill <ruby-process-id>
【讨论】:
简单的方法:
kill #{Process.pid}
【讨论】:
要以简单可重复的方式执行此操作,有几种方法。
在启动 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
您可以使用临时文件而不是使用环境变量 ($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)
【讨论】: