问题描述
我使用以下操作我的rails应用程序
$script/server -d webrick
在我的Ubuntu系统上,上面的命令在后台运行webrick服务器。我可以使用kill命令杀死进程
$kill pid
rails是否提供任何命令来停止后台运行守护程序服务器?
就像rails提供的启动服务器一样,谢谢。
编辑什么时候适合启动守护程序服务器?任何实时场景都有助于谢谢
最佳解决办法
耙子任务怎么样?
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耙子停止
次佳解决办法
如果它有用,在linux上你可以找到哪个进程正在使用一个端口(在本例中为3000)你可以使用:
lsof -i :3000
它也将返回pid
第三种解决办法
像瑞安说:
the pid you want is in tmp/pids/
可能server.pid是你想要的文件。
您应该能够运行kill -9 $(cat tmp/pids/server.pid)
来关闭守护程序服务器。
第四种办法
守护程序服务器的进程ID存储在应用程序目录tmp /pids /中。您可以将标准kill process_id
与您在那里找到的信息一起使用。
第五种办法
杀死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
。这是我倾向于导入到我的开发项目中的rake任务:
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)
第八种办法
运行此命令:
locate tmp/pids/server.pid
输出:此文件的完整路径。如果列表中显示多个文件,请检查项目目录名称以查找相关文件。
然后运行以下命令:
rm -rf [complete path of tmp/pids/server.pid file]
第九种办法
Ruby票证http://bugs.ruby-lang.org/issues/4777表明它是一个内核(Linux)错误。他们提供了一个解决方法(基本上相当于Ctrl-C /Ctrl-Z),如果你妖魔化服务器就可以使用:
-
kill -INT
cat tmp/pids/server.pid
-
杀死-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 [ "$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;
}
我在blog post中写了更多信息。