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

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

  $script/server -d webrick 

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

  $kill pid

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

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

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

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

run с рейк стоп или sudo рейк стоп


Если это может быть полезно, в 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 / задачи / stopserver.рейк!--11-->

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)