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

72

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

  $script/server -d webrick 

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

  $kill pid

Предоставляет ли рельсы любую команду, чтобы остановить фоновый запуск сервера-демона?

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

РЕДАКТИРОВАТЬ. Когда нужно запустить сервер демона? Любой сценарий в реальном времени поможет Спасибо

Теги:

14 ответов

28
Лучший ответ

Как насчет задачи рейка?

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

запустить с остановкой рейка или остановкой sudo rake

  • 9
    Используйте kill -9 только тогда, когда демон завис. В противном случае вы потеряете неопубликованные данные из кэшей Active Directory.
  • 2
    Это может быть, но вы все равно должны использовать сервер только в процессе разработки.
79

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

lsof -i: 3000

он также вернет pid

  • 2
    Даже на Mac / Unix / Bash ... Да. Это супер полезно. lsof -i :3000 говорит мне PID запущенного рубина
  • 0
    +1 к этой команде ..
Показать ещё 5 комментариев
34

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

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

Возможно, server.pid - это файл, который вы хотите.

Вы можете запустить kill -9 $(cat tmp/pids/server.pid), чтобы снести демон-сервер.

  • 5
    После lsof -i :3000 я получаю PID для ruby, а затем kill -9 1406orWhateverThePIDofRubyWas независимо от того, kill -9 1406orWhateverThePIDofRubyWas - easypeasy - спасибо!
  • 0
    Да, и потерять данные, которые находятся в памяти, а не на диске.
18

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

  • 7
    Вот одна строка, которую вы можете назначить псевдониму в вашем файле ~ / .bashrc: kill -9 $(lsof -i:3000) &> /dev/null . Часть после &> является необязательной - она просто подавляет некоторый вывод команды kill.
  • 0
    Я бы рекомендовал не запускать это, потому что в вашем браузере может быть открыт порт 3000, поскольку он общается с вашим сервером Rails. Я случайно убил Chrome пару раз таким образом. :)
16

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

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

Если вы используете Mongrel, этого достаточно:

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

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

  • 0
    Хммм ... но, как отмечалось в другой статье, Rails или WEBrick или кто-то, похоже, игнорирует все более мягкие сигналы. Я пытался "kill -INT", затем "kill -TERM", а затем, наконец, "kill -9", но первые два никогда не работали. google.com/...
12

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

$ lsof -wni tcp:3000

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

$ kill -9 <PID>
6

Запустите эту команду:

locate tmp/pids/server.pid

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

Затем запустите эту команду:

rm -rf [complete path of tmp/pids/server.pid file]
  • 0
    Одна x=`locate tmp/pids/server.pid` && kill `cat ${x}` : x=`locate tmp/pids/server.pid` && kill `cat ${x}`
5

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

Lib/задачи/stopserver.rake

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" и попробуйте перейти на ядро ​​с исправленной ошибкой.

Process.kill "CONT", pid

(подсказка для шляпы: jackr)

5

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

  • kill -INT cat tmp/pids/server.pid
  • kill -CONT cat tmp/pids/server.pid

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

4

Здесь я оставляю функцию 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 [ "$1" = "start" ]; then
     if [ "$2" = "" ]; then
        RENV="development"
     else
        RENV="$2"
     fi
     rails server -d -e "$RENV"
     return 0
  elif [ "$1" = "stop" ]; then
     if [ -f tmp/pids/server.pid ]; then
        kill $2 $(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 [ "$1" = "restart" ]; then
     rails stop && rails start $2
  else
     command rails $@
  fi;
}

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

  • 0
    у вас есть эквивалентный пакетный файл для этого?
  • 1
    Нет, прости
3
one-liner:  kill -INT `ps -e | grep ruby | awk '{print $1}'`

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


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

3

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

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

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

2

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

1

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

Убийство -9 - единственный верный способ остановить рубин на сервере rails? Какие!? Вы знаете последствия этого? Может быть катастрофа...

  • 0
    Я просто потерял данные из-за kill -9. Данные еще не были сброшены в SQLite, просто в памяти. Интересный факт, это было в памяти на неделю.
  • 0
    это комментарий, а не ответ на этот вопрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню