Est-ce que shell scripts appelés de python après le script persistent python se termine?
-
19-09-2019 - |
Question
Dans le cadre d'un test automatisé, j'ai un script python qui doit appeler deux scripts shell qui commencent deux serveurs différents qui ont besoin d'interagir après le script d'appel se termine. (Il est en fait un script Jython, mais je ne suis pas sûr que les choses à ce point.) Que puis-je faire pour vous assurer que les serveurs restent après le script python se termine?
À ce stade, on les appelle quelque chose comme ceci:
def runcmd(str, sleep):
debug('Inside runcmd, executing: ' + str)
os.chdir("/new/dir/")
directory = os.getcwd()
print 'current dir: '+ directory
os.system(str)
t = threading.Thread(
target=runcmd,
args=( cmd, 50,)
)
La solution
fils de Python meurent tous avec Python. En outre, os.system bloque. Mais c'est correct - si la commande que os.system () fonctionne lance un nouveau processus (mais pas un processus enfant), tout ira bien. Sous Windows, par exemple, si la commande commence par « commencer » le « start » 'processus d restera après meurt Python.
EDIT: nohup
est un équivalent à start
sur Linux. (Merci à S. Lott).
Autres conseils
os.system()
ne retourne pas jusqu'à ce que le processus de son lancement a pris fin. Utilisez subprocess
ou Runtime.exec()
si vous le voulez dans un processus séparé.
Je me demande si vous utilisez subprocess.Popen fonctionnerait mieux pour vous.
peut-être faire quelque chose comme shell = True
Fils ne fonctionnera pas parce qu'ils font partie du processus. L'appel system
ne fonctionnera pas car il bloque que votre nouveau processus exécute.
Vous aurez besoin d'utiliser quelque chose comme os.fork()
pour frayer un nouveau processus et l'exécuter dans le nouveau processus. Jetez un oeil à pour subprocess quelques bonnes solutions de style livre de recettes à ce sujet.
En général, pour lancer un serveur de longue durée qui est indépendante de son parent, vous devez daemon il. En fonction de votre environnement, il existe différents outils d'qui peuvent aider dans ce processus.