我正在使用以下命令运行我的Rails应用程序
$script/server -d webrick
在我的Ubuntu系统上,以上命令在后台运行webrick服务器。我可以使用kill命令杀死进程
$kill pid
Rails是否提供任何命令来停止后台运行的守护程序服务器?
就像rails提供的启动服务器一样,谢谢。
编辑何时合适启动守护程序服务器?任何实时情况都会有所帮助,谢谢
Answers:
耙任务怎么样?
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
用rake stop或sudo rake stop运行
如果有用,在Linux上,您可以找到哪个进程正在使用端口(在这种情况下为3000)可以使用:
lsof -i:3000
它也会返回pid
lsof -i :3000
告诉我正在运行的红宝石的PID
kill $(lsof -i :3000 -t)
-该-t选项代表简洁这意味着它将只输出进程ID。
alias stopRails='kill -9 $(lsof -i :3000 -t)'
使用alias startRails='rails server -d'
(如果您不在您的应用程序目录中,它将失败,但是没关系),最后alias restartRails='stopRails && startRails'
pid = `lsof -i :3000 -t`.chomp.to_i
(@ Gerry真的很高兴-t
,我今天学到了一些新东西!)
就像瑞安所说:
您想要的pid在tmp / pids /
可能server.pid是您想要的文件。
您应该能够运行kill -9 $(cat tmp/pids/server.pid)
以关闭守护程序服务器。
lsof -i :3000
获得红宝石的PID之后kill -9 1406orWhateverThePIDofRubyWas
,-easypeasy-谢谢!
杀死Ruby on Rails默认服务器(WEBrick)的唯一正确方法是:
kill -INT $(cat tmp/pids/server.pid)
如果您正在运行Mongrel,则足够:
kill $(cat tmp/pids/server.pid)
使用kill -9
,如果你的守护进程挂起。请记住以下含义kill -9
-如果未将保存在Active Record缓存中的数据刷新到磁盘,则会丢失数据。(就像我最近所做的那样)
在您的终端中查找进程ID(PID):
$ lsof -wni tcp:3000
然后,使用“ PID”列中的数字终止进程:
$ kill -9 <PID>
pguardiario击败了我,尽管他的实现有点危险,因为它使用SIGKILL
而不是(推荐)SIGINT
。我倾向于将以下任务导入我的开发项目中:
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
(帽子提示:杰克)
一张Ruby票证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;
}
我写过的博客文章中提供了更多信息。
如果您使用-d,我认为它不会。我会杀死这个过程。
将来,只需打开另一个终端窗口,然后使用不带-d的命令,它将提供一些非常有用的调试输出。
如果是生产环境,请使用passenger或thin之类的东西,以便他们很容易停止进程或重新启动服务器
单线:kill -INT`ps -e | grep红宝石| awk'{print $ 1}'`
ps -e
列出系统grep ruby
搜索的每个进程,其中
针对ruby进程的输出将该输出
awk
的第一个参数(pid)传递给kill -INT
。
如果您只想查看PID,请尝试使用echo而不是kill。
您可以通过添加-d
命令在后台启动服务器。例如:
puma -d
要停止它,只需杀死端口3000上正在运行的任何进程:
kill $(cat tmp/pids/server.pid)
kill -9
仅在守护程序挂起时使用。否则,您将从Active Directory缓存中丢失未刷新的数据。