Мини-wrapper для Java приложений под *nix
Доброго всем времени суток.
Проблема: При запуске большого числа различных фоновых Java приложений возникает проблема их идентификации при использовании ps/top, т.к. в результате имеем большое количество процессов с именем «java», что не есть удобным.
Есть несколько вариантов решения проблемы:
- Написание JNI wrapper
- Собственное решение
Я решил данную проблему следующим образом
int main (int argc, char** argv)
{
char* java_home = getenv("JAVA_HOME");
const char* java_bin_affix = "/bin/java";
if (java_home == NULL) {
printf("JAVA_HOME is not set! Exiting");
exit(1);
} else {
int length = strlen(java_home) + strlen(java_bin_affix) + 1;
char* java_bin = (char*)malloc(length);
memset(java_bin,0,length);
strcat(java_bin,java_home);
strcat(java_bin,java_bin_affix);
execv(java_bin,argv);
}
}
Данный код позволяет заменить имя процесса «java» на собственное, путем передачи argv текущего процесса замещающему. При этом все аргументы будут переданы по цепочке JVM.
execv, как и остальные функции семейства exec, перезапишет образ текущего процесса, причем таким образом, что pid стартующего процесса и замещающего будут совпадать.
После запуска Java приложения через такой wrapper списке процессов наш будет выглядеть приблизительно таким образом:
# ps ax | grep my_daemon
27061 pts/3 Sl+ 0:00 ./my_daemon test
Данный вывод намного более юзабилен чем множественные «java».