PID Generation mit Spring-Boot
Ich finde dich. Ich finde deine PID und dann bin ich dein Meister
Die PID. Dieses nützliche kleine Ding. Man benötigt sie beispielsweise für Init-Skripte oder das Monitoring der Applikation. Aber wie finde ich die PID von einem Prozess? Klar… ganz einfach so:
Nicht ernst meinen bitte, die bessere Lösung findet sich unten. ;)
foo@bar:~ pgrep java
17889
30554
30555
Hmm…. Hilft nur bedingt gut. Versuchen wir es anders:
foo@bar:~ jps -v
31504 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_66.jdk/Contents/Home -Xms8m
31473 spring-boot-pid-0.0.1-SNAPSHOT.jar
31356 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true
Ok. Da sehen wir das jar. Jetzt können wir ganz leicht an die PID kommen:
foo@bar:~ jps -v | grep spring-boot-pid | awk '{print $1}'
31473
yay! Und damit gehen wir jetzt zu unseren SysOps und können sagen: “Wir wissen jetzt, wie ihr an die PID von unserem Prozess
kommt, den wir gerne im Monitoring hätten. Ihr macht ein jps -v pipe grep
… Nein. So kann es funktionieren, wird aber
nicht unbedingt für Begeisterung sorgen. ;)
Sag mir wo du bist denn ich bin dein Meister
Besser läuft es, wenn wir direkt beim Applikationsstart eine PID generieren lassen. Und mit Spring-Boot wird einem auch dieser Punkt wieder nahezu geschenkt; man muss eben nur wissen dass und wo man die richtigen Strippen ziehen muss. Ihr findet ein entsprechendes Beispiel zu diesem Blog-Post auf meinem Github-Account.
Teil 1⁄2: Der Java Part
Was wir Java-Seitig machen müssen ist ausschließlich einen neuen ApplicationListener
einzubinden, und zwar den
ApplicationPidFileWriter
:
@SpringBootApplication
public class SpringBootPidApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringBootPidApplication.class);
springApplication.addListeners(new ApplicationPidFileWriter());
springApplication.run(args);
}
}
Teil 2⁄2: Der Config Part
Dieser Part ist optional. Wenn man beispielsweise keine Location angibt, wo die PID-File geschrieben werden soll, wird
per default eine Datei application.pid
in dem Applikationsverzeichnis angelegt. Wenn wir uns mit niemand anderem das
Blech teilen, kann man eine PID-File auch schön ins Temp-Verzeichnis schreiben. Unsere application.properties
könnte also
so aussehen:
spring.pid.file=/tmp/app.pid
spring.pid.fail-on-write-error=true
Die erste Zeile ist wie gesagt der Pfad zur PID-File. Die zweite Zeile sorgt dafür, dass die Applikation gar nicht erst startet, wenn die PID-File nicht angelegt werden kann - beispielsweise wenn Berechtigungen fehlen.
Fazit
Damit haben wirs auch schon. Wir haben mit wenigen Zeilen Code mehr Transparenz und Wartbarkeit in unsere Anwendung gebracht:
foo@bar:~ cat /tmp/app.pid
31473%
Cheers!