Popen得到新运行过程的pid

时间:2010-12-06 11:48:23

标签: ruby linux io popen pid

我想在后台运行一些应用程序,然后用pid杀死它。

pipe = IO.popen("firefox 'some_url' 2>&1 &")
pipe.pid

此代码启动firefox并返回一些pid,但不幸的是它不是firefox的pid。

pipe = IO.popen("firefox")
pipe.pid

此代码启动firefox并返回mi一些pid,firefox的pid。 是否有任何解决方案来启动外部应用程序并获得其pid? Firefox只是例如它可以是任何其他应用程序。我也试过像libs那样:Open3和Open4,但似乎效果相同。 我也想知道'$!' bash变量对此有好的解决方案吗?在后台运行一些内容并阅读'$!',您怎么看?

2 个答案:

答案 0 :(得分:7)

由于您在后台运行它(command &),您将获得解释器的PID:

>> pipe = IO.popen("xcalc &")
>> pipe.pid 
=> 11204

$ ps awx | grep "pts/8"
11204 pts/8    Z+     0:00 [sh] <defunct>
11205 pts/8    S+     0:00 xcalc

放弃&

>> pipe = IO.popen("xcalc")
>> pipe.pid
=> 11206

$ ps awx | grep "pts/8"
11206 pts/8    S      0:00 xcalc

有关重定向的其他问题,请参阅@kares的回答

答案 1 :(得分:4)

它不仅仅是在后台运行它,还在于2>&1

重定向err / out会导致IO.popen在您的实际流程前面放置另一个流程(pipe.pid将不正确)

这是一个详细的见解:http://unethicalblogger.com/2011/11/12/popen-can-suck-it.html

可能的解决方法是使用exec,例如IO.popen("exec firefox 'some_url' 2>&1")