首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Process.spawn (Ruby1.9.x):如何检查产卵是否成功并检测错误?

Process.spawn (Ruby1.9.x):如何检查产卵是否成功并检测错误?
EN

Stack Overflow用户
提问于 2017-10-28 21:49:15
回答 1查看 445关注 0票数 0

使用跨平台解决方案(GNU/Linux,Windows),我想在后台生成一个外部程序,捕获它的pid,然后通过存储的pid停止程序。

考虑一下Ruby1.9.x中的代码

代码语言:javascript
复制
pid = Process.spawn("xxx")
puts pid

stdout/stderr:

代码语言:javascript
复制
8117
sh: 1: xxx: not found

不会抛出任何异常,我也看不到任何方法来检测产卵不成功的事实(xxx不是一个有效的命令)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-29 09:02:00

Process#spawn返回一个进程ID。如果您得到一个进程ID,那么从技术上讲,该函数本身并没有失败。在Ruby2.0.0中,如果>=找不到命令,Process#spawn就会抛出Errno::ENOENT。由于ruby 1.9不受支持,最好的解决方案是升级ruby。

一种可能有助于测试进程是否在调用返回后实际运行的攻击。遗憾的是,这将是具体的平台。

代码语言:javascript
复制
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?测试来查看它是否存在。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46994824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档