Я запускаю свое приложение rails, используя следующие
$script/server -d webrick
в моей системе Ubuntu, над командой запустите сервер webrick в фоновом режиме. Я могу убить процесс, используя команду kill
$kill pid
Предоставляет ли рельсы любую команду, чтобы остановить фоновый запуск сервера-демона?
как и предоставленный рельсами для запуска сервера, спасибо.
РЕДАКТИРОВАТЬ. Когда нужно запустить сервер демона? Любой сценарий в реальном времени поможет Спасибо
Как насчет задачи рейка?
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
если это может быть полезно, в linux вы можете найти, какой процесс использует порт (в этом случае 3000) вы можете использовать:
lsof -i: 3000
он также вернет pid
lsof -i :3000
говорит мне PID запущенного рубина
Как сказал Райан:
pid, который вы хотите, находится в tmp/pids/
Возможно, server.pid - это файл, который вы хотите.
Вы можете запустить kill -9 $(cat tmp/pids/server.pid)
, чтобы снести демон-сервер.
lsof -i :3000
я получаю PID для ruby, а затем kill -9 1406orWhateverThePIDofRubyWas
независимо от того, kill -9 1406orWhateverThePIDofRubyWas
- easypeasy - спасибо!
Идентификатор процесса сервера daemon хранится в вашем каталоге приложений tmp/pids/. Вы можете использовать свой стандартный kill process_id
с информацией, которую вы там найдете.
kill -9 $(lsof -i:3000) &> /dev/null
. Часть после &>
является необязательной - она просто подавляет некоторый вывод команды kill.
Единственный правильный способ убить сервер по умолчанию Ruby on Rails (который является WEBrick):
kill -INT $(cat tmp/pids/server.pid)
Если вы используете Mongrel, этого достаточно:
kill $(cat tmp/pids/server.pid)
Используйте kill -9
, если ваш демон висел. Помните о значениях kill -9
- если данные, хранящиеся в кэшах Active Record, не были сброшены на диск, вы потеряете свои данные. (Как я недавно сделал)
В вашем терминале, чтобы узнать идентификатор процесса (PID):
$ lsof -wni tcp:3000
Затем используйте число в столбце PID, чтобы убить процесс:
$ kill -9 <PID>
Запустите эту команду:
locate tmp/pids/server.pid
выход: Полный путь к этому файлу. Проверьте имя каталога проекта, чтобы найти соответствующий файл, если в списке указано несколько файлов.
Затем запустите эту команду:
rm -rf [complete path of tmp/pids/server.pid file]
x=`locate tmp/pids/server.pid` && kill `cat ${x}`
: x=`locate tmp/pids/server.pid` && kill `cat ${x}`
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)
A Ruby ticket, http://bugs.ruby-lang.org/issues/4777, указывает на ошибку ядра (Linux). Они дают работу (по существу эквивалентную Ctrl-C/Ctrl-Z), для использования, если вы демонизировали сервер:
cat tmp/pids/server.pid
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 [ "$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;
}
Дополнительная информация в сообщении в блоге Я написал об этом.
one-liner: kill -INT `ps -e | grep ruby | awk '{print $1}'`
ps -e
перечислены все процессы в системе
grep ruby
выполняет поиск этого результата для рубинового процесса
awk
передает первый аргумент этого вывода
(pid) до kill -INT
.
Попробуйте с помощью эха вместо kill, если вы просто хотите увидеть PID.
Я не думаю, что это произойдет, если вы используете -d. Я просто убью процесс.
В будущем просто откройте другое окно терминала и используйте команду без -d, она предоставляет действительно полезный отладочный вывод.
Если это производство, используйте что-то вроде пассажира или тонкое, чтобы было легко остановить процессы или перезапустить серверы.
если kill pid не работает, тогда удалить файл server.pid в MyRailsApp/tmp/pids/
Я пришел сюда, потому что пытался (неудачно) остановиться с нормальным убийством и думал, что буду делать что-то неправильно.
Убийство -9 - единственный верный способ остановить рубин на сервере rails? Какие!? Вы знаете последствия этого? Может быть катастрофа...
kill -9
только тогда, когда демон завис. В противном случае вы потеряете неопубликованные данные из кэшей Active Directory.