Capistrano任务只有在进程运行时才通过端口终止进程?

时间:2014-01-22 16:03:08

标签: ruby unix capistrano

我非常需要我的问题陈述所说的,目前我的 Capistrano任务看起来像这样:

desc "stops private pub"
task :stop_private_pub do
  run "kill -9 $(lsof -i:9292 -t)"
end
before 'deploy', 'servers:stop_private_pub'

...实际上端口9292 中的进程正在运行时效果很好,问题是当进程未运行时此任务将失败!它停止了整个部署过程!

我不是UNIX Shell专家,也不是Capistrano大师,所以..我真的需要帮助改进这个Capistrano任务,有没有办法 kill -9 只有如果进程正在运行?

我该怎么做?

提前致谢。

2 个答案:

答案 0 :(得分:4)

您可以使用Capistrano的capture命令(至少在V3中,可能是V2等效命令)从您的lsof命令中获取输出,然后仅在您获得PID运行kill命令时才会使用。

pid = capture 'lsof', '-i:9292', '-t'
if pid # ensure it's valid here
   run "kill -9 #{pid}" # make darn sure pid is an integer if you embed it
end

答案 1 :(得分:2)

你也可以这样做:

run "kill -9 $(lsof -i:9292 -t); true"

或添加错误继续:

task :stop_web, :roles => :app, :on_error => :continue do
   run "dosomething.sh; true"
end