• # Chaussette

    Posté par . En réponse au message Communication inter-processus. Évalué à 3.

    Après quelques recherches il me semble que les sockets puissent également être une solution à mon problème.

    J’arrive à ça, en essayant de faire exactement l’équivalent du premier script mais en utilisant socket :

    #!/usr/bin/env python3
    import sys
    import subprocess
    import socket
    import signal
    import os
    pidFilename = '/tmp/'+sys.argv[0]+'.pid'
    socketFilename = '/tmp/'+sys.argv[0]+'.socket'
    def graceful_exit(signum, frame):
     print('I terminate, my PID is '+str(os.getpid())+' and I received signal '+str(signum)+'', file=sys.stderr, flush=True)
     sys.exit(0)
    try:
     if sys.argv[1] == 'start':
     sleeper = subprocess.Popen([sys.argv[0], 'run'], stdin=subprocess.PIPE, shell=False)
     pidfile = open(pidFilename,'w')
     _pid = str(sleeper.pid)
     pidfile.write(_pid)
     pidfile.close()
     elif sys.argv[1] == 'run':
     signal.signal(signal.SIGTERM, graceful_exit)
     signal.signal(signal.SIGINT, graceful_exit)
     if os.path.exists(socketFilename):
     os.remove(socketFilename)
     server = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
     server.bind(socketFilename)
     while True:
     _message = server.recv(65535).decode('UTF-8')
     if _message:
     print('I’m alive, my PID is '+str(os.getpid())+' and I’ve been told to say : « '+_message+' »', file=sys.stderr, flush=True)
     elif sys.argv[1] == 'stop': 
     try:
     pidfile = open(pidFilename,'r')
     os.kill(int(pidfile.read()), signal.SIGTERM)
     pidfile.close()
     os.unlink(pidFilename)
     except (FileNotFoundError, ProcessLookupError):
     pass
     elif sys.argv[1] == 'say' and len(sys.argv) > 1:
     if os.path.exists(socketFilename):
     client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
     client.connect(socketFilename)
     client.send(bytes(sys.argv[2],'utf8'))
     client.close()
    except IndexError as e:
     print(str(e), file=sys.stderr)

    J’ai du mal à appréhender les pour et les contre de chaque méthode.

    En tous cas avec socket je n’ai pas besoin de faire ce truc crade avec sleep()... ça répond tout de suite, et ça n’interfère pas avec le stdin de mon terminal...