Как остановить сервер демона в Rails?



Я запускаю приложение rails, используя следующее



  $script/server -d webrick 


в моей системе Ubuntu , выше команды запустите сервер webrick в фоновом режиме . Я мог бы убить процесс с помощью команды kill



  $kill pid


предоставляет ли rails какую-либо команду для остановки фонового запущенного сервера демонов ?



как тот, который предоставляется rails для запуска сервера, спасибо .



EDIT когда целесообразно запускать сервер демона ? Любой сценарий в реальном времени поможет Спасибо

673   15  

15 ответов:

Как насчет грабли задачи?

desc 'stop rails'
task :stop do
    pid_file = 'tmp/pids/server.pid'
    pid = File.read(pid_file).to_i
    Process.kill 9, pid
    File.delete pid_file
end

бежать с граблями остановить или грабли судо остановки

Если это может быть полезно, в Linux вы можете найти, какой процесс использует порт (в данном случае 3000) вы можете использовать:

lsof-i: 3000

Он тоже вернет pid

как Райан сказал:

pid, который вы хотите, находится в tmp/pids/

наверное, сервер.пид-файл, который вы хотите.

вы должны быть в состоянии работать kill -9 $(cat tmp/pids/server.pid) сбить демонизированный сервер.

идентификатор процесса сервера демона хранится в каталоге приложения tmp/pids/. Вы можете использовать свой стандарт kill process_id с информацией, которую вы найдете там.

только правильный способ убить сервер Ruby on Rails по умолчанию (который является WEBrick):

kill -INT $(cat tmp/pids/server.pid)

если вы работаете дворняга, этого достаточно:

kill $(cat tmp/pids/server.pid)

использовать kill -9 Если ваш демон висел. Помните о последствиях kill -9 - если данные, хранящиеся в кэшах активных записей, не были сброшены на диск, вы потеряете свои данные. (Как я недавно сделал)

в вашем терминале, чтобы узнать идентификатор процесса (PID):

$ lsof -wni tcp:3000

затем используйте число в столбце PID, чтобы убить процесс:

$ kill -9 <PID>

pguardiario бить меня к нему, хотя его реализация немного опасна, так как он использует SIGKILL вместо (рекомендуется) SIGINT. Вот задача рейка, которую я обычно импортирую в свои проекты разработки:

lib / tasks / stopserver.грабли

desc 'stop server'
task :stopserver do
  pid_file = 'tmp/pids/server.pid'
  if File.file?(pid_file)
    print "Shutting down WEBrick\n"
    pid = File.read(pid_file).to_i
    Process.kill "INT", pid
  end
  File.file?(pid_file) && File.delete(pid_file)
end

это вызывает прерывание сервера, если и только если pidfile существует. Он не выдает неприглядные ошибки, если сервер не работает, и он уведомляет вас, если он на самом деле закрывается сервер не работает.

если вы заметили, что сервер не хочет закрываться с помощью этой задачи, добавьте следующую строку после Process.kill "INT" line, и попробуйте обновить до ядра, которое имеет эту ошибку исправлена.

Process.kill "CONT", pid

(наконечник шляпы: jackr)

выполните эту команду:

locate tmp/pids/server.pid

выход: Полный путь к этому файлу. Проверьте имя каталога проекта, чтобы найти соответствующий файл, если в списке отображается несколько файлов.

затем выполните следующую команду:

rm -rf [complete path of tmp/pids/server.pid file]

рубиновый билет,http://bugs.ruby-lang.org/issues/4777, предполагает, что это ошибка ядра (Linux). Они дают работу вокруг (по существу, эквивалентную Ctrl-C / Ctrl-Z), для использования, если вы демонизировали сервер:

  1. kill-INT cat tmp/pids/server.pid
  2. kill-CONT cat tmp/pids/server.pid

это, по-видимому, приводит к обработке исходного сигнала INT, возможно, позволяя сбросить данные и так далее.

здесь я оставляю функцию bash, которая, если вставить в вас .bashrc или .zshrc будет сплав вы делаете такие вещи, как:

rails start # To start the server in development environment
rails start production # To start the server in production environment
rails stop # To stop the server
rails stop -9 # To stop the server sending -9 kill signal
rails restart # To restart the server in development environment
rails restart production # To restart the server in production environment
rails whatever # Will send the call to original rails command

вот она функция:

function rails() {
  if [ "" = "start" ]; then
     if [ "" = "" ]; then
        RENV="development"
     else
        RENV=""
     fi
     rails server -d -e "$RENV"
     return 0
  elif [ "" = "stop" ]; then
     if [ -f tmp/pids/server.pid ]; then
        kill  $(cat tmp/pids/server.pid)
        return 0
     else
        echo "It seems there is no server running or you are not in a rails project root directory"
        return 1
     fi
  elif [ "" = "restart" ]; then
     rails stop && rails start 
  else
     command rails $@
  fi;
}

дополнительная информация в блоге я писал об этом.

Я не думаю, что это так, если вы используете-d. Я бы просто убил процесс.

в будущем, просто откройте другое окно терминала вместо этого и используйте команду без -d, она обеспечивает некоторые действительно полезные выходные данные отладки.

Если это производство, используйте что-то вроде passenger или thin, чтобы они легко останавливали процессы или перезапускали серверы

one-liner:  kill -INT `ps -e | grep ruby | awk '{print }'`

ps -e список всех процессов в системе
grep ruby выполняет поиск выходных данных для процесса ruby
awk передает Первый аргумент этого вывода (пид) к kill -INT.


попробуйте это с echo вместо kill, если вы просто хотите увидеть PID.

Если убить pid не работает, то удалить файловый сервер.pid в MyRailsApp / tmp/pids/

Я пришел сюда, потому что я пытался (безуспешно) остановиться с нормальным убийством, и думал, что я делаю что-то неправильно.

убийство -9-это единственный верный способ остановить сервер ruby on rails? Что?? Знаете ли вы последствия этого? Может быть катастрофа...

вы можете запустить сервер в фоновом режиме, добавив -d в вашей команде. Например:

puma -d

чтобы остановить его, просто убейте любой процесс, запущенный на порту 3000:

kill $(cat tmp/pids/server.pid)

Comments

    Ничего не найдено.