2017-10-28 48 views
0

使用跨平台的解决方案(GNU/Linux,Windows),我想在后台产生一个外部程序,捕获它的pid,稍后通过存储的pid停止程序。Process.spawn(Ruby 1.9.x):如何检查产卵是否成功并检测错误?

考虑的Ruby 1.9.x的验证码:

pid = Process.spawn("xxx") 
puts pid 

标准输出/标准错误:

8117 
sh: 1: xxx: not found 

没有抛出异常,我看不出有什么方法来检测的事实该产卵不成功(xxx不是一个有效的命令)。

什么是最好的方式来检测这种产卵不成功?

回答

1

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?测试来查看它是否存在。

+0

这很有帮助。谢谢。 – cschol