Как демонизировать Java-программу?

Если вы не можете полагаться jre на Java Service Wrapper, процитированный elsewhere (например, если .java вы работаете в Ubuntu, в javax которой нет упакованной версии java-api SW), вы, вероятно, захотите daemon сделать это старомодным способом: иметь java-se свою программу запишите его .java PID в /var/run/$progname.pid java-libraries и напишите вокруг него стандартный processes сценарий инициализации SysV .java (используйте, например, сценарий oraclejdk для ntpd, это просто). Желательно daemon также сделать его совместимым java-libraries с LSB.

По сути, функция запуска daemon проверяет, запущена ли программа core-java (проверяя, существует ли jre /var/run/$progname.pid, и java-se содержимое этого файла является processes PID запущенного процесса), и java-api если не запускается

logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass  $logfile 2>&1

Функция jdk остановки проверяет /var/run/$progname.pid, проверяет, является .java ли этот файл PID запущенного daemon процесса, проверяет, что process это виртуальная машина Java java-se (чтобы не убить процесс, который process просто повторно использовал daemon PID из мертвого экземпляра j2se моего Java-демона), а затем jre убивает этот процесс.

При core-java вызове мой метод main() начнет j2se с записи своего PID в файл, определенный java-se в System.getProperty ("pidfile").

Однако jdk есть одно серьезное препятствие: в java-api Java нет простого и стандартного java способа получить PID процесса, в daemon котором выполняется JVM.

Вот daemon что я придумал:

private static String getPid() {
    File proc_self = new File("/proc/self");
    if(proc_self.exists()) try {
        return proc_self.getCanonicalFile().getName();
    }
    catch(Exception e) {
        /// Continue on fall-back
    }
    File bash = new File("/bin/bash");
    if(bash.exists()) {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
        try {
            Process p = pb.start();
            BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
            return rd.readLine();
        }
        catch(IOException e) {
            return String.valueOf(Thread.currentThread().getId());
        }
    }
    // This is a cop-out to return something when we don't have BASH
    return String.valueOf(Thread.currentThread().getId());
}

java

process

daemon

2022-11-20T17:12:09+00:00
Вопросы с похожей тематикой, как у вопроса:

Как демонизировать Java-программу?