7
votes

Trouver un identifiant de processus par nom

Comment puis-je trouver un PID par nom ou ligne de commande complète dans RUBY, sans appeler un exécutable externe?

J'envoie SIGUSR2 à un processus dont la ligne de commande contenait ruby ​​job.rb . Je voudrais faire ce qui suit sans l'appel à pGREP : xxx


1 commentaires

Cela ne répond pas à la question, mais si nous effectuons déjà un appel de système externe, nous pouvons également tuer le processus ici. Par exemple. `pgrep -f 'Quelque travail' | Xargs Kill` ​​


3 Réponses :


9
votes

Comment faire cela dépend de votre système d'exploitation. En supposant que Linux, vous pouvez affamer manuellement le système de fichiers / proc connaissances et rechercher la bonne ligne de commande. Cependant, c'est la même chose que PGREP fait et rendra le programme moins em> portable.

quelque chose comme ça pourrait fonctionner. P>

def get_pid(cmd)
  Dir['/proc/[0-9]*/cmdline'].each do|p|
    if File.read(p) == cmd
      Process.kill( "USR2", p.split('/')[1] )
    end
  end
end


3 commentaires

En parlant de moins portable - cela ne fonctionne pas sur Solaris. Vous pensez que vous courez sur Linux ici.


Oui, j'ai dit "en supposant que Linux".


+1 a accepté une autre réponse, mais j'aime aussi ça. Un rappel de ce que vous pouvez faire sur Linux dans n'importe quelle langue avec juste le système de fichiers



5
votes

une recherche rapide Google est venu avec SYS_PROCTABLE , qui devrait vous laisser faire cela dans un manière portable.

Disclaimer: je n'utilise pas Ruby, je ne peux pas confirmer si cela fonctionne.


0 commentaires

1
votes

Systèmes basés sur Debian Trouvez PID avec commande PIDOF.

Certaines fonctionnalités de processus de tuer avec RUBY: P>

def killPid(cmd)
   pid=exec("pidof #{cmd}")
   Process.kill "USR2", pid
end


2 commentaires

Si vous exécutez plusieurs instances de la même commande avec différents params, PIDOF ne vous aidera pas


Cela peut être dangereux, selon l'endroit où provient le paramètre. Vous interpoliez une chaîne dans une commande. La chaîne peut bien être le test ; rm -rf / var / www / . Exec peut prendre des choses comme celle-ci dans plusieurs arguments, donc exécuté ('pidof', cmd) serait beaucoup plus sûr.