Auto-Login und Starten eines Scriptes
Wir sind bereits darauf eingegangen, wie man ein Debian so hinbastelt, dass es crashresistent ist. Über debootstrap und das Paket „live-boot“ wird beim Boot des Rechners das Dateisystem in den RAM geladen, nur dort gepatcht und bei Crash/Neustart ist alles wieder so, wir wir es ursprünglich gepackt haben.
Ebenfalls sind wir darauf eingegangen, wie wir in dieses Konstrukt eine node.js-App reinknoten – auch wenn es nur ein primitiver HTTP-Server war, der Anfragen auf Port 8080 beantwortet, hat er seinen Zweck erfüllt.
Für alle, die gerade ein großes Fragezeichen im Gesicht haben, geht es hier noch mal zu dem Beitrag. Für alle anderen geht es weiter zu der Frage – wie bekommen wir nun unsere node.js-App im Vordergrund, statt als Dienst, gestartet?
Der Zweizeiler vorweg
Wir gehen hier nicht noch mal auf das Erstellen von ISO-Images ein.
Wer davon noch keine Ahnung hat – siehe der oben verlinkte Beitrag.
In unserem Fall haben wir nun schon ein fertiges, debootstrapped Debian und können dort rein-chrooten.
Anlage eines Benutzers für das entsprechende Programm
Den Benutzer nennen wir einfach „add“:
useradd -m -s /bin/bash app
Auf das „/bin/bash“ gehe ich später ein, aber vorerst: das wars.
Aktivieren von autologin
Zuerst erstellen wir folgendes Verzeichnis:
/etc/systemd/system/[email protected]
In diesem Verzeichnis erstellen wir eine Datei override.conf
und füllen sie mit folgendem Inhalt:
[Service]
ExecStart=
ExecStart=-/sbin/agetty --autologin app --noclear %I 38400 linux
Was es macht – es loggt automatisch TTY1 (also die Ausgabe via Desktop, nicht über z.B. SSH) als root ein, behält den Log von vor dem Login bei, und startet mit einer Baud-Rate von 38.4000 und der Umgebungsvariable TERM auf „linux“ gesetzt die Standardshell des Benutzers.
Anschließend aktivieren wir den neu angelegten Dienst:
systemctl enable [email protected]
Nach Erstellung des Images und Boot von diesem sollte der Benutzer „app“ automatisch eingeloggt werden.
Setzen in den Autostart
Wir könnten nun unser Programm als Login-Shell nutzen. Es würde funktionieren, solange wir den Benutzer, als der die Anwendung läuft, nicht wirklich brauchen; ansonsten können wir nicht vernünftig mit dem arbeiten (jeder su per SSH startet eine neue Instanz des Programmes).
Klügere Idee – ja, Bash verbraucht mehr Ressourcen, aber wir setzen das als Login-Shell und passen unser ~/.bashrc
an:
# Nur im interaktiven Modus aktiv werden
case $- in
*i*) ;;
*) return;;
esac
# Alias-Definitionen laden
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# Bei Konsolensitzung: unser Script starten
if [ "$(tty)" = "/dev/tty1" ]
then
bash /app/console.sh
fi
Der Inhalt dieser Datei sagt aus: beim Starten von Bash auf tty1 (Konsolen-Sitzung) soll das Script /app/console.sh
ausgeführt werden.
Schreiben eines Scriptes im Autostart
Unser /app/console.sh
gestalten wir wie folgt:
#!/bin/bash
while true; do
node /app/console.js
done
Hier der Inhalt: wir starten via node immer wieder die console.js
– ist sie beendet (Crash?) landen wir am Ende der while-Schleife, landen wieder am Anfang, und das Script wird erneut von vorne ausgeführt.
Nun das ganze noch ausführbar machen:
chmod 0755 /data/console.sh
Damit kann der Besitzer des Scriptes (Dateieigentümer) das Script bearbeiten, alle anderen können es lesen und ausführen.
Eine node-App
Folgende kleine node-App habe ich vorbereitet:
const readline = require('readline');
const rl = readline.createInterface({input: process.stdin, output: process.stdout });
function Ask() {
rl.question('Input: ', function (resp) {
if(resp == "exit") return process.exit(0);
else console.log("You entered: "+ resp);
Ask();
});
}
rl.on('close', function () { console.log('readline closed'); process.exit(1); });
Ask();
Funktionsweise: wir werden rekursiv nach einem Input gefragt. Geben wir was an, gibt er es aus. Geben wir exit an, schließt sich das Programm.
Die legen wir in /data/console.js
ab.
Neue ISO erstellen, von dieser booten – und schon startet eine VM, die uns stumpf nach Input fragt, diesen dann ausgibt, und beim Beenden sich selber wieder startet: