Popen获取新运行进程的pid

7

我想在后台运行一些应用程序,并通过pid稍后将其关闭。

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

这段代码启动了Firefox并返回了一些pid,但不幸的是它并不是Firefox的pid。

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

这段代码启动了Firefox并返回了它的进程ID,但我想知道是否有办法启动外部应用程序并获取其进程ID?Firefox只是一个例子,实际上可以是任何其他应用程序。我也尝试过使用像Open3和Open4这样的库,但似乎效果相同。

我还想知道'$!' bash变量是否是解决此问题的好方法?在后台运行某些东西并读取'$!',你认为呢?


这是任何正在运行的进程的pid吗?通常,您使用popen启动的命令可以生成任意数量的其他进程,因此,如果您想要从中获取特定的pid,则需要找到其他识别所需进程的方法。 - The Archetypal Paul
2个回答

8

由于您正在后台运行它(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的答案


4

这不仅仅是在后台运行,还涉及到2>&1的重定向错误/输出,会导致IO.popen将另一个进程放在您的实际进程前面(pipe.pid将不正确)

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

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


的确,我完全忽略了这一点。 - tokland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接