如何在Rails中停止守护进程服务器?

我正在运行我的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上,你可以find哪个进程正在使用一个端口(在这种情况下,3000),你可以使用:

lsof -i:3000

它也会返回PID

像瑞安说:

你想要的pid是在tmp / pids /

可能server.pid是你想要的文件。

你应该可以运行kill -9 $(cat tmp/pids/server.pid)来closures守护进程的服务器。

守护程序服务器的进程ID存储在您的应用程序目录tmp / pids /中。 你可以使用标准的kill process_id和你在那里find的信息。

杀死Ruby on Rails默认服务器(即WEBrick)的唯一正确方法是:

 kill -INT $(cat tmp/pids/server.pid) 

如果你正在运行Mongrel,这就足够了:

 kill $(cat tmp/pids/server.pid) 

如果守护进程挂起,请使用kill -9 。 记住kill -9的含义 – 如果Active Recordcaching中保存的数据没有刷新到磁盘,则将丢失数据。 (正如我最近所做的那样)

在您的terminal中找出进程ID(PID):

 $ lsof -wni tcp:3000 

然后,使用PID列中的数字来终止进程:

 $ kill -9 <PID> 

运行这个命令:

 locate tmp/pids/server.pid 

输出:该文件的完整path。 如果多个文件显示在列表中,请检查您的项目目录名称以查找有关的文件。

然后运行这个命令:

 rm -rf [complete path of tmp/pids/server.pid file] 

一个Ruby票据, http://bugs.ruby-lang.org/issues/4777 ,表明这是一个内核(Linux)的错误。 他们提供了一个解决scheme(基本上相当于Ctrl-C / Ctrl-Z),如果你已经将服务器妖魔化了,

  1. kill -INT cat tmp/pids/server.pid
  2. kill -CONT cat tmp/pids/server.pid

这似乎导致原始的INT信号被处理,可能允许数据刷新等等。

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存在时才会向服务器发出中断。 如果服务器没有运行,它不会出现难看的错误,并且它会通知您是否真的closures了服务器。

如果您注意到服务器不想使用此任务closures,请在Process.kill "INT"行后添加以下行,并尝试升级到修复此bug的内核。

 Process.kill "CONT", pid 

(帽子提示: jackr )

在这里,我留下一个bash函数,如果粘贴在你的.bashrc.zshrc ,你将会.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:

 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,我不认为这样做。 我只是杀了这个过程

将来只要打开另一个terminal窗口,使用不带-d的命令,它提供了一些非常有用的debugging输出。

如果这是生产,则使用诸如乘客或瘦客户机之类的东西,以便他们很容易停止进程或重新启动服务器

单行:kill -INT`ps -e |  grep ruby​​ |  awk“{print $ 1}”

ps -e列出系统上的每个进程
grep rubysearch输出的ruby进程
awk将该输出的第一个参数(pid)传递给kill -INT

如果你只是想看看PID,可以用echo来代替kill。

如果kill pid不起作用,则删除MyRailsApp中的文件server.pid / tmp / pids /

我来到这里是因为我试图(不成功)停止正常的杀戮,并认为我会做错的事情。

kill -9是在rails服务器上停止ruby的唯一方法吗? 什么!? 你知道这个的含义吗? 可能是一场灾难…