Как остановить синатру от бега?

Если ruby myapp.rb запускает предварительный просмотр sinatra на localhost: 4567, как я могу программно остановить/остановить/убить его? Команда терминала (кроме Ctrl-C) или задач Rake будет в порядке.

Мне нужно включить это в задачу или терминал Rake.

Ответы

Ответ 1

В myapp.rb добавьте это до начала синатра:

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

Если вы хотите его убить, сделайте это в оболочке:

kill <pid>

Где <pid> - номер, выданный myapp.rb. Если вы хотите сделать это в рубине:

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

В OS X из командной строки (Terminal.app или DTerm) просто введите:

$ killall ruby

каждый рубиновый процесс остановится. Синатра тоже.

В Linux (и других UNIX) вы можете:

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

Ответ 3

Простой способ сделать это:

kill #{Process.pid}

Ответ 4

Чтобы сделать это простым повторимым способом, существует несколько методов.

  • Запишите ПИД-код при запуске сервера Sinatra, например

    # 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)