Esta no es una solución completa, pero podría ser suficiente para convertirse en una. Definitivamente hay un punto en el que existe el proceso java
(y por lo tanto puede ser controlado por pbind
) y en ese punto aún no ha ejecutado el código para hacer la verificación del procesador. Si pudiera pausar el lanzamiento de la aplicación hasta que pbind haya hecho su trabajo, debería estar bien (suponiendo que la idea de pbind funcione desde el punto de vista de la verificación de la CPU).
Una forma de hacer esto que definitivamente debería detener a la JVM en un lugar apropiado es la conexión de socket para los depuradores remotos y comenzando con el modo de suspensión. Si pasa los siguientes argumentos al java
invocación:
-Xdebug -Xrunjdwp: transport = dt_socket, dirección = 8000, suspender = S, = y servidor
continuación, la JVM hará una pausa después de comenzar el proceso de Java pero antes de ejecutar la clase principal, hasta que un depurador/agente esté conectado al puerto 8000.
Entonces, quizás sería posible usar un script de envoltura para iniciar el programa en segundo plano con estos parámetros, dormir por un segundo más o menos, utilice pbind para establecer el número de procesadores en uno para el proceso de java, luego un ttach y desconecta un agente al puerto 8000 (que será suficiente para que Java proceda con la ejecución).
Defectos o posibles hipocresías en esta idea sería si la ejecución en modo de depuración afectaría notablemente el rendimiento de su aplicación (no parece tener un gran impacto en general), si puede controlar algún tipo de no-op Agente de JDWP desde la línea de comandos, y si puede abrir puertos en la máquina. No es algo que haya tratado de automatizar antes (aunque he usado algo muy similar de forma manual para aumentar el valor de nice
de un proceso Java antes de soltarlo), por lo que podría haber otros problemas que he pasado por alto.
Sí, gracias, pero desafortunadamente eso no responde mi pregunta. –