Как демонизировать 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
Как демонизировать Java-программу?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.