Попен получает pid недавно запущенного процесса - PullRequest
6 голосов
/ 06 декабря 2010

Я хочу запустить какое-то приложение в фоновом режиме, а затем убить его с помощью pid.

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

Этот код запускает Firefox и возвращает мне немного PID, но, к сожалению, это не PID Firefox.

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

Этот код запускает firefox и возвращает mi некоторый pid, pid firefox.Есть ли решение запустить внешнее приложение и получить его pid?Firefox только для примера это может быть любое другое приложение.Я также пробовал с библиотеками вроде: Open3 и Open4, но, похоже, тот же эффект.Мне также интересно, если '$!'Переменная bash является хорошим решением для этого?Запустите что-нибудь в фоновом режиме и прочитайте '$!', Как вы думаете?

Ответы [ 2 ]

7 голосов
/ 06 декабря 2010

Поскольку вы запускаете его в фоновом режиме (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 голосов
/ 13 марта 2012

это не только запуск в фоновом режиме, но и из-за 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")

...