Script im Hintergrund ausführen bei beendeter SSH-Sitzung

Schnell mal ein Backup durchführen mag bei kleineren Datenmengen in wenigen Minuten geschehen, aber wenn es sich um mehrere hundert GB handelt, kann das schonmal ein paar Stunden dauern.
Natürlich habe ich dafür einen Eintrag in der Crontab, aber was ist mit außerplanmäßigen Backups?

Dafür gibt es nohup, das dafür sorgt (zusammen mit einem angehängten &), dass das laufende Script in den Hintergrund geschoben wird.
In meinem Fall lautet der Aufruf nohup ./backup.sh &.

Danach kann man z.B. über top prüfen, was das Script grade so im Hintergrund treibt.

Kleine Ergänzung von Gerald:

Bei Programmen mit Ausgabe von Text kann man den Fortschritt auch mit ‘tail -f nohup.out’ betrachten.

Quelle & Dank: Gerald

MySQL-Dump lokal einspielen

Warum bietet der phpMyAdmin eigentlich keine Lösung dafür, Daten die auf dem Server liegen direkt einzuspielen? Auch in der letzten 3er Version gibt es nur den grausamen HTTP-Upload. Macht nicht wirklich Spaß größere Dumps zu übertragen, auch wenn es lokal stattfindet.

Naja, zum Glück gibt es SSH für Webserver und lokal unter Windows können wir das ganze noch einfacher erledigen.

Zuerst muss eine neue Datenbank erstellt werden. Dies kann man entweder per phpMyAdmin oder per Kommandozeile erledigen:
C:\xampp\mysql\bin>mysqladmin –user=root create datenbankname
Danach kann der Dump (in meinem Fall 390MB groß) eingespielt werdem:
C:\xampp\mysql\bin>mysql –user=root datenbankname < C:\backup2010_02_12__23_00.sql
(evtl. muss noch ein Passwort mit –pass=xxx angegeben werden)

Wenn nach einer kurzen Wartezeit keine Fehlermeldung auftaucht, hat alles geklappt.

Vermutlich wird es aber (bei größeren Dumps) zu einer Fehlermeldung ähnlich dieser kommen:
ERROR 2006 (HY000) at line 51206: MySQL server has gone away
(Die Zeilennummer wird natürlich nicht die selbe sein)

Die Meldung ist ziemlich sinnlos, die Lösung relativ einfach.
In der my.ini muss der Wert für die maximale Packetgröße einer SQL-Query erhöht werden:
max_allowed_packet = 16M
Der Standard-Wert ist 1M.

Die Reste des Rehgulaschs werden entfernt

Seit Montag ist das Auto in der Werkstatt …
Die Abgabe dauerte 2 Minuten – nach 30 Minuten war ich wieder vom Hof. Ich habe einen VW Sharan als Probewagen bekommen – netterweise zahlt die Versicherung keinen Ersatzwagen, weil der Wagen ja noch fahrbereit ist.
Achso, warum 30 Minuten? Naja, die Jungs vom Autohaus mussten den Wagen erst noch aus einer Schneewehe ausgraben. *g*

Tja, letzter Stand, den ich Montag Abend zu hören bekam: “Da ist wohl doch noch mehr kaputt – aber das regeln wir direkt mit der Versicherung”. Also wenn 3.700 Euro Schaden noch gar nicht der komplette Umfang sind, ach ich will’s gar nicht wissen.

Bei r.sh läuft ja gerade die Aktion “Wir zahlen ihre Rechnung”. Lustigerweise haben sie gerade jemanden gezogen, der einen Auffahrunfall mit seinem Wagen hatte. Ok, das ist nicht lustig, aber die Rechnung betrug gnadenlose 450 Euro … ich weiß nicht, ob die Plastikteile bei mir am Wagen vergoldet sind?!

Nur für Blu-Ray-Disk-Player geeignet

Ja, unglaublich, aber wahr. Es steht tatsächlich drauf – entweder auf dem Playstation 3 Werbesticker auf der Front oder auch direkt auf dem Cover (wenn auch auf der Rückseite). WARUM?

Warum steht auf DVDs nicht “Diese DVD ist nur in DVD-Playern abspielbar” drauf?

Warum stand auf den VHS-Kassetten nicht, dass diese nur für VHS-Geräte geeignet sind?

Ich meine eine CD legt auch keiner auf ‘nen Plattenspieler, oder?

PHP, cURL und die SESSION

Mir hat ein kleines Problem beinahe das Genick gebrochen … mehrstündige Recherchen im Netz brachten mich keinen Meter weiter, ich hoffe der Artikel hilft dem ein oder anderen bei der “Fehlersuche” – aber fangen wir von vorne an.

Sessions sind eine prima Sache, wer Daten über mehrere Scripte hinaus austauschen will, der greift darauf zurück.
Leider passiert es nun manchmal, dass man ein eigenes Script als fertiges HTML benötigt – ein include() per HTTP fällt aber auf vielen Servern dank der allow_url_include Konfigurationseinstellung flach, also muss cURL her.
Mit cURL können wir ein beliebiges Script per HTTP aufrufen und den Inhalt in der aktuellen Seite einbinden, ohne dass ein User etwas davon merkt.

Wer nun aber denkt, er könne die Session-Daten auch in dem Script abgreifen, das per cURL geladen wird, der wird sein blaues Wunder erleben. cURL generiert jedesmal eine neue Session-ID, anstatt die vorhandene fortzusetzen – ist ja auch klar, das ist, als ob man einen zweiten Browser startet, also übergibt man die Session-ID. Entweder kann man diese einfach als GET-Parameter anhängen, oder man setzt eine cURL-Option für ein Cookie.

Das sieht dann so aus:

Wer jetzt das Script aufruft, wird mit einer Sanduhr belohnt. Das Script läd und läd und hört nicht auf. Ein neuer Seitenaufruf schlägt ebenfalls fehlt und wird wieder mit einer Sanduhr belohnt. Der User denkt dann sein Browser wäre abgestürzt, weil nichts mehr funktioniert.

Warum?

Wenn man es weiß, ich die Lösung (wie immer) ganz einfach.
PHP schreibt die Session-Daten erst bei der Beendigung eines Scripts in die Datei auf dem Server. Während das Script läuft, ist die Datei gesperrt, so dass nicht mehrere Scripte gleichzeitig die Daten ändern. Wir müssen also dafür sorgen, dass die Session-Daten gespeichert werden, bevor wir das nächste Script aufrufen. Das erledigt session_write_close(); für uns.

Die Daten in der Superglobalen $_SESSION stehen nach dem Schließen selbstverständlich noch (read-only) zur Verfügung.
Lese- und Schreibrechte hat jetzt aber das per cURL aufgerufene Script.