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