Lancer un processus complètement indépendant
Je voulais lancer un processus à partir de mon script python (main.py)
plus précisément je veux exécuter la commande ci-dessous
`nohup python ./myfile.py &`
et ce fichier myfile.py
devrait même après mon principal python script se termine.
En outre je souhaite obtenir le pid
de la nouvelle procédure.
J'ai essayé os.spawnl*
os.exec*
& subprocess.Popen
méthodes, tous sont résiliation de mon myfile.py
si mon main.py script se termine.
J'ai peut-être raté quelque chose.
Mise à jour: puis-je utiliser os.startfile
avec xdg-open
? Est-ce une bonne solution?
Exemple
a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid
Si je coche ps aux | grep long_process
je ne pouvais pas voir tout processus en cours d'exécution.
long_process.py qui ne cesse de l'impression du texte: pas de sortie.
Je fais quelque chose de mal ici?
source d'informationauteur Garfield
Vous devez vous connecter pour publier un commentaire.
Vous ouvrez votre processus de longue et garder un tuyau, il. Donc, vous vous attendez à parler. Lorsque votre script de lancement, les sorties, on ne peut plus parler d'elle.
Le long processus en cours d'exécution reçoit unSIGPIPE
et les sorties.Le code suivant juste a fonctionné pour moi (Linux, Python 2.7).
Créer un long-exécutable:
Exécuter Python REPL:
Quitter le REPL et de voir le processus toujours en cours d'exécution:
Si vous voulez d'abord communiquer à commencé le processus et de le laisser seul pour courir plus loin, vous avez quelques options:
SIGPIPE
dans votre processus de longue, ne meurent pas. Vivre sans stdin après le lanceur de processus s'arrête.Vous pouvez utiliser
os.fork()
.Vous ne voyez pas les processus en cours d'exécution parce que l'enfant
python
processus s'arrête immédiatement. LePopen
arguments sont incorrectes comme @user4815162342 dit dans le commentaire.De lancer un complètement indépendant processus, vous pouvez utiliser
python-daemon
le paquet ou de l'utilisation de systemd/supervisord/etc:Bien qu'il peut être suffisant dans ton cas, pour démarrer l'enfant avec la bonne
Popen
arguments:Si le processus de l'enfant ne nécessite pas de
python2.5
alors vous pouvez utilisersys.executable
à la place (pour utiliser la même version de Python en tant que parent).Remarque: le code ferme
DEVNULL
dans le parent, sans attendre le processus de l'enfant à la fin (il n'a pas d'effet sur l'enfant).