a dev's blog

Some thoughts about thoughts.

PID Generation mit Spring-Boot

2016-02-19 Development Java Spring

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 12: 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 22: 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!