Ich habe einen nicht portablen Ansatz verwendet, um die UNIX-PID von dem Process
Objekt abzurufen, das sehr einfach zu befolgen ist.
SCHRITT 1:
Verwenden Sie einige Reflection-API-Aufrufe, um die Process
Implementierungsklasse auf der Zielserver-JRE zu identifizieren (denken Sie daran, dass dies Process
eine abstrakte Klasse ist). Wenn Ihre UNIX-Implementierung meiner entspricht, wird eine Implementierungsklasse mit einer Eigenschaft namens pid
angezeigt, die die PID des Prozesses enthält. Hier ist der Protokollierungscode, den ich verwendet habe.
final Class<?> clazz = process.getClass();
logger.info("Concrete implementation of " + Process.class.getName() +
" is: " + clazz.getName());
final Field[] allFields = clazz.getDeclaredFields();
for (Field field : allFields) {
field.setAccessible(true);
Class<?> fieldClass = field.getType();
StringBuilder sb = new StringBuilder(field.getName());
sb.append(" | type: ");
sb.append(fieldClass.getName());
sb.append(" | value: [");
Object fieldValue = null;
try {
fieldValue = field.get(process);
sb.append(fieldValue);
sb.append("]");
} catch (Exception e) {
logger.error("Unable to get value for [" +
field.getName() + "]", e);
}
logger.info(sb.toString());
}
SCHRITT 2:
Schreiben Sie basierend auf der Implementierungsklasse und dem Feldnamen, die Sie aus der Reflection-Protokollierung erhalten haben, Code, um die Process
Implementierungsklasse zu stehlen und die PID mithilfe der Reflection-API daraus abzurufen. Der folgende Code funktioniert für mich in Bezug auf UNIX. Möglicherweise müssen Sie die Konstanten EXPECTED_IMPL_CLASS_NAME
und anpassen EXPECTED_PID_FIELD_NAME
, damit es für Sie funktioniert.
Integer retrievePID(final Process process) {
if (process == null) {
return null;
}
final String EXPECTED_IMPL_CLASS_NAME = "java.lang.UNIXProcess";
final String EXPECTED_PID_FIELD_NAME = "pid";
final Class<? extends Process> processImplClass = process.getClass();
if (processImplClass.getName().equals(EXPECTED_IMPL_CLASS_NAME)) {
try {
Field f = processImplClass.getDeclaredField(
EXPECTED_PID_FIELD_NAME);
f.setAccessible(true);
int pid = f.getInt(process);
return pid;
} catch (Exception e) {
logger.warn("Unable to get PID", e);
}
} else {
logger.warn(Process.class.getName() + " implementation was not " +
EXPECTED_IMPL_CLASS_NAME + " - cannot retrieve PID" +
" | actual type was: " + processImplClass.getName());
}
return null;
}