Process#spawn
返回进程ID。如果你得到一个进程ID,那么从技术上来说,函数本身并没有失败。在Ruby> = 2.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
不幸的是,如果过程在您测试其存在的时间结束时,您不能说。你可能想检查它的结果(无论它做什么),看看它是否也做到了。
另一种方法,如果你控制着程序的启动,就是在启动之前打开一个命名管道,让它发送一个消息到你正在运行的管道上。您可以在spawn
以非阻塞方式呼叫之后从管道中读取数据,并使用Timeout
来防止永久阻塞。一个更简单,不太干净的方法是让该程序为文件写一些确定性的内容,然后使用简单的File.exist?
测试来查看它是否存在。
来源
2017-10-29 09:02:00
Tom
这很有帮助。谢谢。 – cschol