Если вы не можете положиться на Java Service Wrapper процитировано в другом месте (например, если вы работаете в Ubuntu, у которой нет упакованной версии SW), вы, вероятно, захотите сделайте это по старинке: пусть ваша программа напишет свой PID в /var/run/$progname.pid и напишите стандартный сценарий инициализации SysV (например, используйте его для примера ntpd, это просто). Желательно также сделать его совместимым с LSB.
По сути, функция запуска проверяет, запущена ли уже программа (проверяя, существует ли /var/run/$progname.pid и является ли содержимое этого файла идентификатором PID запущенного процесса), и если он не запущен
logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1
Функция stop проверяет /var/run/$progname.pid, проверяет, является ли этот файл PID запущенного процесса, проверяет, является ли она виртуальной машиной Java (чтобы не уничтожать процесс, который просто повторно использовал PID). из мертвого экземпляра моего Java-демона), а затем убивает этот процесс.
При вызове метод main () запускается путем записи его PID в файл, определенный в System.getProperty ("pidfile").
Однако есть одно серьезное препятствие: в Java нет простого и стандартного способа получения PID процесса, в котором работает JVM.
Вот что я придумала:
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());
}