Wenn dies in den DBA-Austausch verschoben werden sollte, entschuldige ich mich. Fühlt sich für mich eher nach Linux als nach DB an, also los geht’s:
Ich habe einige Maschinen, die jede Nacht geplante Cron-Jobs ausführen und mir die Ergebnisse per E-Mail schicken. Ich möchte für solche Dinge keine E-Mails. Generell denke ich, dass die Art und Weise, wie wir E-Mails verwenden, nicht funktioniert, aber das ist eine andere Geschichte.
Also dachte ich darüber nach, dass ich eine zentrale SQLite-Datenbank führen könnte, in der Informationen darüber gespeichert werden, wann die Jobs gestartet und beendet wurden, und vielleicht sogar die Ausgabe. Dann könnte ich einfach eine Webseite erstellen, die das abfragt und mir mitteilt, was letzte Nacht passiert ist.
Also habe ich mir ein einfaches Schema ausgedacht und kann diesen Befehl am Anfang eines Skripts ausführen.
sqlite3 dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"
Jetzt habe ich also einen Datensatz, der angibt, wann mein Job gestartet wurde und zu welcher Zeit. Hurra. Dann kann ich einen ähnlichen Befehl ausführen, um die Zeit anzugeben, zu der der Job endet.
Also. Das funktioniert hervorragend, wenn sich die Datenbank und die Aufgaben auf derselben Maschine befinden. Ich gehe zu einer anderen Maschine und muss die SQLite-Datenbank aktualisieren.... Wie kann ich das effizient tun?
Ich habe dies versucht
ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"'
Aber das gibt zurück:
Error: no such column: NOW
Ich habe einige Variationen ausprobiert, bin aber nicht weitergekommen.
Bin ich nah dran? Sollte ich etwas völlig anderes tun? Erfinde ich das Rad neu?
Antwort1
Das kommt alles vom Zitieren. Versuchen Sie es mit diesem:
ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET \
LastStart = DATETIME('''NOW''') WHERE TaskName = '''taskname'''"'
p.s. Sie müssen Anführungszeichen setzen NOW
, sonst versucht SQLite, eine Spalte mit diesem Namen zu finden. Aber Ihre Anführungszeichen '
werden von Anführungszeichen von SSH überlagert. Sie können nicht entkommen '
, daher werden drei Anführungszeichen '''
verwendet (das erste ist das SSH-Anführungszeichen, das zweite ist das Anführungszeichen, das Sie an SQLite übergeben müssen, und das letzte ist wieder das offene SSH-Anführungszeichen).
pps. Außerdem kann man Anführungszeichen wie folgt umkehren:
ssh [email protected] "sqlite3 /home/aaron/dbname.db \"UPDATE data SET \
LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'\""