7

アプリケーションをバックグラウンドで実行し、後で pid で強制終了したいと考えています。

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

このコードは Firefox を起動し、いくつかの pid を返しますが、残念ながらそれは Firefox の pid ではありません。

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

このコードは、Firefox を起動し、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

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")

于 2012-03-13T11:16:19.827 に答える