Manchmal laufen SQL-Queries sehr lange, z.B. die Nachbearbeitung beim Einlesen von ALKIS NAS-Dateien. Um diese auszuführen möchte man nicht die ganze Zeit den Client offen haben und auf eine Rückmeldung warten. Solche Prozesse sollen im Hintergrund laufen. Außerdem möchte man sich ab und an ansehen wie weiter der Prozess ist und ob vielleicht Fehler aufgetreten sind.
Das läßt sich unter Linux leicht machen. Dennoch mußte ich immer wieder nachsehen wie das noch ging.
Hier fasse ich das mal kurz zusammen.
SQL-Befehl im Hintergrund ausführen:
PGPASSWORD=geheim; psql -U pguser -f langlaufendesqlanweisungen.sql datenbankname > langlaufendesqlanweisungen.log 2> langlaufendesqlanweisungen.err &
Dadurch, dass man die Umgebungsvariable PGPASSWORD zusammen auf die Zeile mit dem psql Query schreibt, wird das Passwort für die Anmeldung bei Postgres verwendet ohne, dass man noch mal das Passwort eingeben muss. Das wäre in einem Hintgergrundprozess, der durch das Zeichen & erzeugt wird nicht gegangen. psql hätte im Hintergrund auf das Passwort gewartet und nix gemacht. Hier werden die Ausgaben auf die Datei .log umgeleitet und die Fehler auf die Datei .err.
Ausgeben was im Prozess passiert:
tail -f langlaufendesqlanweisungen.log
Wenn man die Anzeige der Logdatei abbrechen möchte, einfach Ctr.-C.
Wenn man vielleicht einen lang laufenden Prozess abbrechen möchte, kann man diesen killen. Dazu fragt man erstmal die Prozess ID ab mit:
ps ux | grep langlaufendesqlanweisungen
und dann
kill -9 id
Das sollte man jedoch nur machen wenn man weiß was man tut. Vorzugsweise nur, wenn das gesamte SQL in einer Transaktion ausgeführt wird oder die Anweisungen rückgängig gemacht werden können oder bei einer Wiederholung der Ausführung auch das richtige Ergebnis rauskommt.
Welche SQL-Befehle gerade in der Datenbank abgearbeitet werden kann man sich auch ansehen mit dem SQL-Befehl:
SELECT * FROM pg_stat_activity;
Befehle werden in eine Shell ausgeführt. Wenn eine Shell geschlossen wird, schickt diese eventuell das Signal -SIGHUP an alle Kindprozesse, die in dieser Shell laufen. Das heißt der Prozess läuft zwar im Hintergrund, würde aber abgebrochen werden, wenn man die Shell schließt. Um zu prüfen ob die eigene Shell -SIGHUP schickt kann man den folgenden Befehl verwenden:
shopt | grep hupon
Wird huponexit off ausgegeben, kann man die Shell getrost schließen. Steht dort on, kann man den Befehl nohup verwenden. nohup wird einfach vor die Befehlszeile gestellt, die im HIntergrund ausgeführt werden soll, z.B. so:
nohup PGPASSWORD=geheim; psql -U pguser -f langlaufendesqlanweisungen.sql datenbankname > langlaufendesqlanweisungen.log 2> langlaufendesqlanweisungen.err &