Wenn Sie sich nicht auf den an anderer Stelle genannten Java Service Wrapper verlassen können (z. B. wenn Sie Ubuntu ausführen, das keine gepackte Version von SW enthält), möchten Sie dies wahrscheinlich auf die altmodische Weise tun: Lassen Sie Ihr Programm seine PID in / schreiben var / run / $ schedame.pid und schreiben Sie ein Standard-SysV-Init-Skript (verwenden Sie beispielsweise das für ntpd als Beispiel, es ist einfach). Machen Sie es vorzugsweise auch LSB-konform.
Im Wesentlichen testet die Startfunktion, ob das Programm bereits ausgeführt wird (indem getestet wird, ob /var/run/$progname.pid vorhanden ist und der Inhalt dieser Datei die PID eines laufenden Prozesses ist) und ob es nicht ausgeführt wird
logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1
Die Stoppfunktion überprüft /var/run/$progname.pid, prüft, ob diese Datei die PID eines laufenden Prozesses ist, und überprüft, ob es sich um eine Java-VM handelt (um einen Prozess nicht zu beenden, der die PID einfach von einem Toten wiederverwendet hat Instanz meines Java-Daemons) und beendet dann diesen Prozess.
Beim Aufruf beginnt meine main () -Methode damit, ihre PID in die in System.getProperty ("pidfile") definierte Datei zu schreiben.
Eine große Hürde: In Java gibt es keine einfache und standardmäßige Methode, um die PID des Prozesses zu ermitteln, in dem die JVM ausgeführt wird.
Folgendes habe ich mir ausgedacht:
private static String getPid() {
File proc_self = new File("/proc/self");
if(proc_self.exists()) try {
return proc_self.getCanonicalFile().getName();
}
catch(Exception e) {
}
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());
}
}
return String.valueOf(Thread.currentThread().getId());
}