我正在开发一个 ruby 框架来运行不同的作业,我需要做的一件事是知道这些作业何时结束,以便使用它们的输出并组织所有内容。我一直在毫无问题地使用它,但是一些同事开始在不同的系统中使用它,并且发生了一些非常奇怪的事情。我所做的是使用运行命令
i,o,e,t = Open3.popen3(job.get_cmd)
p = t.pid
后来我检查工作是否像这样结束:
begin
Process.getpgid(p)
rescue Errno::ESRCH
# The process ended
end
它在我正在运行的系统(Scientifi linux 6)中完美运行,但是当我的一个朋友开始在 Ubuntu 14.04 上运行(使用 ruby 1.9.3p484)并且命令是命令的串联,例如cmd1 && cmd2 && cmd3
每个命令同时运行由系统,不是一个接一个,返回的pidt.pid
既不是正在运行的不同进程的pid。
我修改了代码,而不是运行 cammands 的串联,而是创建了一个脚本,其中包含从 popen3 调用的命令中的所有命令,Open3.popen3("./script.sh")
但行为是相同的......所有命令同时运行并且 pid ruby 知道不是任何进程 pid...
我不确定这是否与 ruby 相关,但由于script.sh
手动运行它的行为符合预期,一个接一个地运行一个命令,似乎 ruby 没有相应地启动进程,或者系统没有按应有的方式读取进程。你知道可能会发生什么吗?
非常感谢!
编辑:正在运行的命令如下所示
./myFit.exe h vlq.config &> output_h.txt && ./myFit.exe d vlq.config &> output_d.txt && ./myFit.exe p vlq.config &> output_p.txt
这个命令,如果手动运行而不是在 ruby 脚本内运行完美,正是这个命令。从 ruby 脚本运行时,它会同时运行所有 myFit.exe 执行(但我希望它们与 h && 一起运行,因为如果前面的工作正常,我希望它们运行)。Myfit.exe 是一个适合的工具,不是系统命令。同样,如果手动运行此命令,则运行完美。