使用跨平台解决方案(GNU/Linux,Windows),我想在后台生成一个外部程序,捕获它的pid,然后通过存储的pid停止程序。
考虑一下Ruby1.9.x中的代码
pid = Process.spawn("xxx")
puts pidstdout/stderr:
8117
sh: 1: xxx: not found不会抛出任何异常,我也看不到任何方法来检测产卵不成功的事实(xxx不是一个有效的命令)。
什么是最好的方法来检测这个产卵是不成功的?
发布于 2017-10-29 09:02:00
Process#spawn返回一个进程ID。如果您得到一个进程ID,那么从技术上讲,该函数本身并没有失败。在Ruby2.0.0中,如果>=找不到命令,Process#spawn就会抛出Errno::ENOENT。由于ruby 1.9不受支持,最好的解决方案是升级ruby。
一种可能有助于测试进程是否在调用返回后实际运行的攻击。遗憾的是,这将是具体的平台。
pid = Process.spawn("xxx")
case RUBY_PLATFORM
when /linux/i
success = File.exist?("/proc/#{pid}")
when /windows/i
# use win32api gem, Windows API call EnumProcesses
else
# ?
end不幸的是,如果该过程在测试其存在时结束,则无法判断。您可能希望检查它的结果(不管它做什么),看看它是否也这样做了。
另一种方法,如果您控制正在启动的程序,是在启动之前打开一个命名管道,并让它在管道上向您的ruby程序发送一条正在运行的消息。然后,您可以在spawn调用之后以非阻塞的方式从管道中读取数据,并使用Timeout来防止它永远阻塞。一种更简单、不那么干净的方法是让该程序为一个文件编写一些确定性的东西,您可以使用简单的File.exist?测试来查看它是否存在。
https://stackoverflow.com/questions/46994824
复制相似问题