代码之家  ›  专栏  ›  技术社区  ›  Dr. Frankenstein

如何阻止西纳特拉逃跑?

  •  14
  • Dr. Frankenstein  · 技术社区  · 16 年前

    如果 ruby myapp.rb

    我需要将其合并到Rake任务或终端中。

    4 回复  |  直到 9 年前
        1
  •  22
  •   Adrian    16 年前

    在myapp.rb中,在sinatra启动之前添加以下内容:

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

    当你想杀死它时,在一个壳里这样做:

    kill <pid>
    

    <pid> 是myapp.rb输出的数字。如果你想用ruby来做:

    Process.kill 'TERM', <pid>
    

    这两个都可以让辛纳特拉执行退出程序。如果不想每次都键入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
  •  13
  •   Diego Freniche    13 年前

    在OS X中,从命令行(Terminal.app或DTerm)只需输入:

    $ killall ruby
    

    每个ruby进程都会停止。西纳特拉也是。

    在Linux(和其他Unix)中,您可以:

    $ ps aux | grep ruby
    $ kill <ruby-process-id>
    
        3
  •  0
  •   ocodo    8 年前

    最简单的方法是:

    kill #{Process.pid}
    
        4
  •  0
  •   ocodo    8 年前

    要以一种简单的可重复的方式实现这一点,有几种方法。

    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. 而不是使用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)