2010-12-06 52 views
6

Je veux exécuter une application en arrière-plan et la tuer plus tard par pid.Popen obtenant pid du processus nouvellement exécuté

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

Ce code démarre firefox et me renvoie un peu de pid, mais malheureusement ce n'est pas le pid de firefox.

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

Ce code démarre firefox et renvoie mi un peu de pid, firefox's pid. Y at-il une solution pour démarrer l'application externe et obtenir son pid? Firefox est seulement par exemple cela pourrait être n'importe quelle autre application. J'ai aussi essayé avec des libs comme: Open3 et Open4 mais semble avoir le même effet. Je me demande aussi si '$!' bash variable est une bonne solution pour cela? Exécutez quelque chose en arrière-plan et lisez '$!', Qu'en pensez-vous?

+0

Est-ce le pid de n'importe quel processus de runninng? En général, la commande que vous lancez avec popen peut générer un nombre quelconque d'autres processus, donc si vous voulez un pid spécifique parmi ceux que vous avez besoin de trouver un autre moyen d'identifier le processus que vous recherchez. –

Répondre

7

Puisque vous exécutez en arrière-plan (command &), vous le PID de l'interprète:

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

Drop the &:

>> pipe = IO.popen("xcalc") 
>> pipe.pid 
=> 11206 

$ ps awx | grep "pts/8" 
11206 pts/8 S  0:00 xcalc 

Pour la question supplémentaire avec la redirection, voir @ la réponse de kares

4

il ne s'agit pas seulement de l'exécuter en arrière-plan, mais aussi en raison 2>&1

redirigeant err/les causes IO.popen pour mettre un autre processus devant votre processus réel (pipe.pid ne sera pas correct)

est ici un aperçu détaillé: http://unethicalblogger.com/2011/11/12/popen-can-suck-it.html

solution possible pour cela pourrait utiliser exec par exemple

+0

En effet, j'ai complètement négligé cela. – tokland