2016-11-09 4 views
2

Je veux utiliser pkill -f myPattern dans le sous-processus d'un python:Python subprocess pkill

import subprocess as sp 

def stop_process(name,host): 
    host = host.strip() 
    if host == socket.gethostname(): 
     sp.call ([ 'pkill -f', name ]) 
    else: 
     sp.call ([ 'ssh', host, 'pkill -f ' + name ]) 

quand je l'appelle stop_process avec tous les nœuds cluster, il fonctionne pour tous les nœuds, mais le noeud courant. Autrement dit, lorsque host == socket.gethostname() l'application imprime Terminated et quitte.

Est-ce la bonne façon d'arrêter le processus avec un modèle donné? Si oui, comment puis-je résoudre ce problème?

Merci

+0

Pourrait-il être que dans le premier appel vous utilisez une liste alors que dans la seconde vous utilisez une chaîne pour la commande pkill? Puis-je vous suggérer d'utiliser shlex.split? –

+0

Êtes-vous sûr que 'host == socket.gethostname()' est 'True'? –

+0

Oui, même sans aucune condition si, il se bloque. J'ai testé avec 'os.system ('pkill -f' + nom)'. Encore une fois, l'application s'arrête avec le message 'Terminated' –

Répondre

0

Lorsque vous démarrez votre programme python vous invoquez probablement passer le nom du processus pour tuer (juste deviner ici ..). pkill trouverez également ce processus (vous utilisez -f) et le tuer avant qu'il ne se termine correctement. Vous devez trouver un moyen de filtrer le pid du programme python (essayez os.getpid() par exemple), ou utilisez uniquement le nom du processus (en évitant l'option -f).

Cela ne se produit que sur votre ordinateur local car seul le programme python est exécuté.