Ruby Capistrano任务仅在进程正在运行时通过端口终止进程?

Ruby Capistrano任务仅在进程正在运行时通过端口终止进程?,ruby,unix,capistrano,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任务,看起来像这样:

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任务,如果进程正在运行,是否有办法杀死-9

我该怎么做


提前感谢。

您可以使用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

您可以使用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
你也可以这样做:

run "kill -9 $(lsof -i:9292 -t); true"
或加载项错误继续:

task :stop_web, :roles => :app, :on_error => :continue do
   run "dosomething.sh; true"
end
你也可以这样做:

run "kill -9 $(lsof -i:9292 -t); true"
或加载项错误继续:

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

很好,我喜欢这个!我想出了另一个解决方案,但这一个有效。:)很好,我喜欢这个!我想出了另一个解决方案,但这一个有效。:)