me gustaría evitar que múltiples instancias de la misma pitón-carreras de larga secuencia de comandos de línea de comandos se ejecuten al mismo tiempo, y me gustaría que la nueva instancia para ser capaz de enviar datos a la instancia original antes de la nueva instancia se suicida ¿Cómo puedo hacer esto de forma multiplataforma?¿puede un script de python saber que se está ejecutando otra instancia del mismo script ... y luego hablar con él?
En concreto, me gustaría que el siguiente comportamiento:
- "
foo.py
" se inicia desde la línea de comandos, y se mantendrá funcionando durante mucho tiempo-- días o semanas hasta que la máquina es reiniciado o el proceso principal lo mata. - cada pocos minutos, el mismo script se inicia de nuevo, pero con diferentes parámetros de línea de comandos
- cuando se inicia, el script debería ver si se están ejecutando otras instancias.
- si otros casos se están ejecutando, entonces ejemplo # 2 debería enviar sus parámetros de línea de comandos de ejemplo # 1, y después ejemplo # 2 debe salir.
- ejemplo # 1, si recibe parámetros de línea de comando desde otro script, debe girar un nuevo hilo y (utilizando los parámetros de línea de comandos enviados en el paso anterior) comenzar a realizar el trabajo de esa instancia nº 2 se va a realizar .
Así que estoy buscando dos cosas: ¿cómo puede un programa de python saber que se está ejecutando otra instancia de sí mismo, y cómo puede un programa de línea de comando de python comunicarse con otro?
Haciendo esto más complicado, el mismo guión necesita para funcionar en Windows y Linux, por lo que idealmente la solución sería utilizar solamente la biblioteca estándar de Python y no ninguna llamada específicos de OS. Aunque si necesito tener una ruta de código de Windows y una ruta de código * nix (y una gran declaración if
en mi código para elegir una u otra), eso está bien si no es posible una solución de "mismo código".
Me doy cuenta de que probablemente podría encontrar un enfoque basado en archivos (por ejemplo, la instancia # 1 mira un directorio para ver los cambios y cada instancia suelta un archivo cuando quiere hacer un trabajo) pero estoy un poco preocupado limpiar esos archivos después de un apagado no gracioso de la máquina. Idealmente, podría usar una solución en memoria. Pero de nuevo soy flexible, si un enfoque basado en archivos persistentes es la única forma de hacerlo, estoy abierto a esa opción.
Más detalles: Estoy tratando de hacer esto porque nuestros servidores están utilizando una herramienta de supervisión que permite ejecutar secuencias de comandos python para recopilar datos de supervisión (por ejemplo, resultados de una consulta de base de datos o llamada de servicio web). uso posterior Algunas de estas secuencias de comandos son muy costosas de iniciar, pero son baratas para ejecutarse después del inicio (por ejemplo, hacer una conexión de base de datos o ejecutar una consulta). Así que hemos elegido mantenerlos en funcionamiento en un ciclo infinito hasta que el proceso principal los mate.
Esto funciona muy bien, pero en los servidores de mayor tamaño 100 casos del mismo script puede estar en ejecución, incluso si sólo están reuniendo datos cada 20 minutos cada uno. Esto causa estragos en la memoria RAM, los límites de conexión de DB, etc. Queremos cambiar de 100 procesos con 1 hilo a un proceso con 100 hilos, cada uno ejecutando el trabajo que, previamente, estaba haciendo un script.
Pero cambiar la forma en los guiones son invocados por la herramienta de monitorización no es posible. Necesitamos mantener la invocación igual (iniciar un proceso con diferentes parámetros de línea de comandos) pero cambiar los scripts para reconocer que otro está activo, y hacer que el script "nuevo" envíe sus instrucciones de trabajo (desde los parámetros de línea de comando) a a la "vieja" secuencia de comandos.
Por cierto, esto no es algo que quiera hacer en una sola secuencia de comandos. En su lugar, quiero incluir este comportamiento en una biblioteca que muchos autores de scripts pueden aprovechar: mi objetivo es permitir a los autores de scripts escribir scripts sencillos de un solo subproceso que no tengan en cuenta los problemas de varias instancias y manejar el multi-threading. y de una sola instancia bajo las sábanas.
¿Por qué te pegas a que el script de trabajo sea el mismo que el de los scripts de invocación de comando? El script de trabajador podría ser un proceso de servidor que recibe comandos, enviados por clientes de retransmisión de comandos, llamados por su marco de supervisión, que solo tienen una tarea: decirle al servidor lo que debe hacer. – Bernd