Подтвердить что ты не робот

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

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

  $script/server -d webrick 

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

  $kill pid

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

lsof -i: 3000

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

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

$ lsof -wni tcp:3000

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

$ kill -9 <PID>

Ответ 7

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)

Ответ 8

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

locate tmp/pids/server.pid

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

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

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

Ответ 9

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, возможно, позволяет сбросить данные и т.д.

Ответ 10

Здесь я оставляю функцию 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 [email protected]
  fi;
}

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

Ответ 11

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

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

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

Ответ 12

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

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


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

Ответ 13

если процесс kill не работает, то удалите файл server.pid из MyRailsApp/tmp/pids/

Ответ 14

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

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

Ответ 15

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

puma -d

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

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