7

我想在后台运行一些应用程序,然后用 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 只是举例,它可以是任何其他应用程序。我也尝试过使用以下库:Open3 和 Open4,但效果似乎相同。我也想知道'$!' bash 变量是解决这个问题的好方法吗?在后台运行一些东西并阅读'$!',你怎么看?

4

2 回答 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 的回答

于 2010-12-06T12:26:08.810 回答
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")

于 2012-03-13T11:16:19.827 回答