web-dev-qa-db-fra.com

Ouvrir un processus avec Popen et obtenir le PID

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?

28
Hubro

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.

29
krousey