Daemon zum Herunterfahren des Systems als systemd-unit

  • Hallo zusammen,

    als kleines Nebenprodukt hier mal ein daemon, der von systemd verwaltet wird.

    Er lauscht auf der Multicast-Adresse 225.0.0.37:12345 und erwartet dort ein "HALT"-Kommando ( kann man z.B. mit netcat auch von einem anderen Rechner aus schicken: echo "HALT" |nc -w1 -u 225.0.0.37 12345 ).

    Der daemon ist Teil meines aktuellen Vorhabens mit dem Raspi und derzeit nur ganz rudimentär aufgebaut.

    Die Datei für die system-Unit wie auch Source und Makefile findet ihr im Anhang.

    //EDIT:

    Einfach einen Ordner namens shutdown_d im Home-Verzeichnis des Users pi erstellen ( mkdir /home/pi/shutdown_d )und die drei Dateien erst mal dort hinein kopieren.

    In das Verzeichnis wechseln ( cd /home/pi/shutdown_d ), die Datei Makefile.txt nach Makefile umbenennen ( mv Makefile.txt Makefile ) und die Datei "service_unit.txt" nach /etc/systemd kopieren ( sudo cp service_unit.txt /etc/systemd/system/shutdown_d ).

    Anschliessend einfach make aufrufen ( make ) und den service aktivieren bzw. starten ( sudo systemctl enable shutdown_d bzw. sudo systemctl start shutdown_d ).

    //EDIT: ich musste das "klassische daemonisieren" durch doppelte fork() rausnehmen, da systemd das scheinbar nicht schnallt und einen falschen Status angezeigt hatte.

    Vielleicht kann's der eine oder andere, zumindest als Vorlage, ja brauchen.

    cu,

    -ds-

  • Daemon zum Herunterfahren des Systems als systemd-unit? Schau mal ob du hier fündig wirst!

  • Weil ich früher auch nur mit C und später mit C++ programmiert habe, war ich natürlich neugierig, wie das Programm so aussieht. Ein bisschen bin ich ja erschrocken, wie viel ich als Rentner schon vergessen habe... das ist mir ja mittlereweile doch alles ziemlich fremd geworden. Deswegen habe ich auch nicht so recht durchschaut, ob das Programm noch was anderes tut, als nur auf das "halt" zu warten. Tut es noch was anderes? Ich meine, über 500 Zeilen Source-Code ist echt ne Menge. Ich schaff das gleiche mit 1 Zeile ... sogar auch als Daemon *lacht*

    Schick diese Zeile im Terminal ab und beende das Fenster mit "exit".

    Code
    ([ "$(/bin/nc -l -p 62555)" == "halt" ] && /usr/bin/systemctl poweroff) &

    Jetzt kannst Du ein beliebiges neues Terminal öffnen und den Rechner einfach mit

    Code
    /bin/echo halt  > /dev/tcp/localhost/62555

    herunterfahren. Das geht natürlich auch im Netz an eine beliebige IP-Adresse, ganz ohne SSH. Und es lässt sich perfekt via kleiner service-unit einrichten. Damit es sich bei anderen Commands nicht beendet, brauchts noch nen mini-loop, aber das wars auch schon. Aber ich frage mich, wo ist da mein Gedankenfehler bezogen auf Dein umfangreiches Programm?

  • Servus @ThomasL,

    ja doch ... etwas mehr macht das schon.

    Es ginge also auch etwas kürzer ... allerdings ist halt im Grunde alles drin, wenn auch rudimentär, was man so benötigen könnte.

    Und klar gibt's immer mehrere Möglichkeiten. Find' ich aber, ehrlich gesagt, eher langweilig. So hab' ich wenigstens was, um mich mal näher mit dem systemd zu beschäftigen.

    Der service ist halt Bestandteil eines Mechanismus in Verbindung mit einem SonOff-Modul. Daran bastle ich seit einiger Zeit und hin und wieder gibt's mal ein paar Nebenprodukte ( u.a. auch Modelle für den 3D-Drucker ).

    Aber das stelle ich vor, wenn ich alles beisammen habe.

    btw: 500 Zeilen sind eher wenig, finde ich. Da hab' ich schon Arduino-sketches mit über 10.000 Zeilen fabriziert und hier eingestellt ;)

    //EDIT: ich hab' im Eingangspost den C-Source aktualisieren müssen ...

    cu,

    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!