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 python3importsysimportsubprocessimportsocketimportsignalimportospidFilename='/tmp/'+sys.argv[0]+'.pid'socketFilename='/tmp/'+sys.argv[0]+'.socket'defgraceful_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:ifsys.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()elifsys.argv[1]=='run':signal.signal(signal.SIGTERM,graceful_exit)signal.signal(signal.SIGINT,graceful_exit)ifos.path.exists(socketFilename):os.remove(socketFilename)server=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)server.bind(socketFilename)whileTrue:_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)elifsys.argv[1]=='stop':try:pidfile=open(pidFilename,'r')os.kill(int(pidfile.read()),signal.SIGTERM)pidfile.close()os.unlink(pidFilename)except(FileNotFoundError,ProcessLookupError):passelifsys.argv[1]=='say'andlen(sys.argv)>1:ifos.path.exists(socketFilename):client=socket.socket(socket.AF_UNIX,socket.SOCK_DGRAM)client.connect(socketFilename)client.send(bytes(sys.argv[2],'utf8'))client.close()exceptIndexErrorase: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...
# Chaussette
Posté par Marotte ⛧ . 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 :
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...