Pull to refresh

Мини-wrapper для Java приложений под *nix

Reading time1 min
Views721
Доброго всем времени суток.

Проблема: При запуске большого числа различных фоновых Java приложений возникает проблема их идентификации при использовании ps/top, т.к. в результате имеем большое количество процессов с именем «java», что не есть удобным.

Есть несколько вариантов решения проблемы:
  1. Написание JNI wrapper
  2. Собственное решение

Я решил данную проблему следующим образом

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».
Tags:
Hubs:
Total votes 10: ↑9 and ↓1+8
Comments10

Articles