Как остановить сервер демона в Rails?
Я запускаю приложение rails, используя следующее
$script/server -d webrick
в моей системе Ubuntu , выше команды запустите сервер webrick в фоновом режиме . Я мог бы убить процесс с помощью команды kill
$kill pid
предоставляет ли rails какую-либо команду для остановки фонового запущенного сервера демонов ?
как тот, который предоставляется rails для запуска сервера, спасибо .
EDIT когда целесообразно запускать сервер демона ? Любой сценарий в реальном времени поможет Спасибо
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), для использования, если вы демонизировали сервер:
- kill-INT
cat tmp/pids/server.pid- 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выполняет поиск выходных данных для процесса rubyawkпередает Первый аргумент этого вывода (пид) кkill -INT.
попробуйте это с echo вместо kill, если вы просто хотите увидеть PID.
Я пришел сюда, потому что я пытался (безуспешно) остановиться с нормальным убийством, и думал, что я делаю что-то неправильно.
убийство -9-это единственный верный способ остановить сервер ruby on rails? Что?? Знаете ли вы последствия этого? Может быть катастрофа...
вы можете запустить сервер в фоновом режиме, добавив
-dв вашей команде. Например:puma -dчтобы остановить его, просто убейте любой процесс, запущенный на порту 3000:
kill $(cat tmp/pids/server.pid)
Comments