Je travaille sur une petite fonction astucieuse:
def startProcess(name, path):
"""
Starts a process in the background and writes a PID file
returns integer: pid
"""
# Check if the process is already running
status, pid = processStatus(name)
if status == RUNNING:
raise AlreadyStartedError(pid)
# Start process
process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', Shell=True)
# Write PID file
pidfilename = os.path.join(PIDPATH, name + '.pid')
pidfile = open(pidfilename, 'w')
pidfile.write(str(process.pid))
pidfile.close()
return process.pid
Le problème est que process.pid
n'est pas le PID correct. Il semble qu'il soit toujours inférieur de 1 au PID correct. Par exemple, il indique que le processus a commencé à 31729, mais ps
indique qu'il s'exécute à 31730. Chaque fois que je l'ai essayé par 1. Je suppose que le PID qu'il renvoie est le PID du - actuel processus, pas celui démarré, et le nouveau processus obtient le pid 'suivant' qui est 1 supérieur. Si tel est le cas, je ne peux pas simplement compter sur le retour de process.pid + 1
puisque je n'ai aucune garantie que ce sera toujours correct.
Pourquoi process.pid
renvoyer le PID du nouveau processus, et comment puis-je obtenir le comportement que je recherche?
De la documentation à http://docs.python.org/library/subprocess.html :
Popen.pid L'ID de processus du processus enfant.
Notez que si vous définissez l'argument Shell sur True, il s'agit de l'ID de processus du shell généré.
Si Shell
est faux, il devrait se comporter comme prévu, je pense.