2010-12-06 2 views
6

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

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

Этот код запускает firefox и возвращает мне pid, но, к сожалению, это не firefox's pid.

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

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

+0

Является ли это pid любого процесса runninng? В общем, команда, которую вы запускаете с помощью popen, может порождать любое количество других процессов, поэтому, если вам нужен определенный pid, вам нужно найти другой способ идентификации процесса, которым вы пользуетесь. – 2010-12-06 11:58:24

ответ

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 '

4

Дело не только в том, чтобы запустить его в фоновом режиме, но и должно быть 2>&1

перенаправлять Err/из причин IO.popen поставить еще один процесс в передней части фактического процесса (pipe.pid не будет правильным)

вот подробный анализ: http://unethicalblogger.com/2011/11/12/popen-can-suck-it.html

можно исправить это можно с помощью exec например IO.popen("exec firefox 'some_url' 2>&1")

+0

Действительно, я полностью забыл об этом. – tokland 2015-03-13 19:07:35

Смежные вопросы