Script starten @reboot/shutdown

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nephilim
Beiträge: 39
Registriert: 06.03.2017 18:11:50

Script starten @reboot/shutdown

Beitrag von nephilim » 24.04.2017 18:50:32

Hej zusammen,

ich benutze systemd-networkd um mein Netzwerk zu verwalten.

Mein Ziel ist, sobald der Server heruntergefahren oder neu gestartet wird, zuerst noch ein Skript läuft. Welche Möglichkeiten bieten sich da an? Eine eigene Service-Unit wäre mir am liebsten, allerdings weiß ich da nicht, wie die einzelnen Sektionen sollten.

LG // neph

TomL

Re: Script starten @reboot/shutdown

Beitrag von TomL » 24.04.2017 21:21:05

Das ist problemlos möglich.... aber dazu bedarf es Festlegungen....

Schau Dir mit einem Pict-Viewer die Ausgabe von

Code: Alles auswählen

systemd-analyze plot >~/bootplot.svg
an, um festzulegen, wo Dein Script sich "einreihen" soll. Dann schau Dir darüber hinaus die gegebenen Targets mit

Code: Alles auswählen

systemctl list-units --type target
an, um festzulegen, ob Dein Script möglicherweise zwingend nach einem Target oder zwingend vor einem Target gestartet werden soll.... dabei gehts um erfüllte Abhängigkeiten.

Die folgenden Targets werden wohl die im Regelfall relevanten Targets sein:

Code: Alles auswählen

basic.target           loaded active active Basic System               
graphical.target       loaded active active Graphical Interface        
local-fs.target        loaded active active Local File Systems         
remote-fs.target       loaded active active Remote File Systems        
network.target         loaded active active Network                    
multi-user.target      loaded active active Multi-User System
Ohne die Abhängigkeiten Deines Scripts zu kennen, bzw. wann es den Job frühestens oder ggf. spätestens erledigen soll/darf/kann/muss, kann Dir Deine Frage keiner beantworten.

https://www.freedesktop.org/software/sy ... ecial.html

nephilim
Beiträge: 39
Registriert: 06.03.2017 18:11:50

Re: Script starten @reboot/shutdown

Beitrag von nephilim » 25.04.2017 10:25:03

Hallo Thomas,

ich habe mich missverständlich ausgedrückt. Entschuldigung.

Mir geht es nur um den Prozess des Herunterfahrens. Den Startup habe ich auch dank Deines network_wait_online.service & - script bereits problemlos am Laufen. Mein Wunsch ist es jetzt, ein Script beim Herunterfahren laufen zu lassen. Ich hatte gehofft, dass auch mit systemd-analyze analysieren zu können. Weil ich nicht wusste, wie das gelingen kann, habe ich etwas im Netz gesucht und herausgefunden, dass das dafür nicht geeignet sei. Nun stehe ich da und weiß nicht so recht, wie ich das bewerkstelligen kann.

Ich möchte nur, dass wenn ich shutdown -h now oder reboot eingebe, einfach am Anfang dieses Prozesses ein Script angestoßen wird. Das Script soll noch eine Datei schreiben, die beim Start des Servers wichtig wird.

LG // neph

TomL

Re: Script starten @reboot/shutdown

Beitrag von TomL » 25.04.2017 15:23:26

nephilim hat geschrieben:Ich möchte nur, dass wenn ich shutdown -h now oder reboot eingebe, einfach am Anfang dieses Prozesses ein Script angestoßen wird. Das Script soll noch eine Datei schreiben, die beim Start des Servers wichtig wird.
Das ist relativ einfach. Hier ein kleines Testszenario, mit dem Du prüfen kannst, obs das tut, was Du möchtest:

Code: Alles auswählen

nano /usr/local/bin/create-journal-entry

Code: Alles auswählen

#!/bin/bash
echo "User=$USER, Parm1=$1 Parm2=$2 Parm3=$3" | systemd-cat -t "thlu:`basename $0`" -p info
exit 0
Das Script kannst Du auch für andere Sachen nutzen, für neue Units.... wenn man die neuen Units erstmal ins System einbinden möchte, ohne das die in der Entwicklungsphase schon was besonderes tun (müssen/dürfen).

Und hier eine Beispiel-Service-Unit, die das obige Script beim Runterfahren des Systems aufruft:

Code: Alles auswählen

nano /etc/systemd/system/start-before-shutdown.service

Code: Alles auswählen

[Unit]
Description=thlu:start-before-shutdown.service: Start at shutdown, reboot, halt
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/create-journal-entry "started from before-shutdown.service (shutdown/reboot/halt" "active/running"

[Install]
RequiredBy=shutdown.target reboot.target halt.target
Als erstes ein grundsätzlicher Funktionstest.... dazu zwei Terminalfenster als root öffnen.
Im ersten starten:

Code: Alles auswählen

journalctl -f
Im zweiten starten und das Ergebnis im ersten sehen:

Code: Alles auswählen

/usr/local/bin/create-journal-entry "manuell gestartet von mir selber" "active/running"
Dann, wenn der manuelle Journaleintrag korrekt erstellt wurde, kannst Du die Unit einplanen

Code: Alles auswählen

cd /etc/systemd/system
systemctl enable start-before-shutdown.service
systemctl reboot
Nach dem Start holst Du Dir zuerst die Zeit des betreffenden Journaleintrags:

Code: Alles auswählen

journalctl -b -1 | grep thlu
und schaust dann im Gesamt-Log nach, wie er sich in den Shutdown/Reboot-Jobs eingereiht hat. Dazu scrollst Du einfach auf die Zeit vor, die Du gerade rausgesucht hast. Damit kannst Du prüfen, ob Dein Job nicht zu früh und nicht zu spät gestartet wurde,

Code: Alles auswählen

journalctl -b -1
Bei der ganzen Aktion bitte nicht die Rechte für Unit (rw-,r--,r--) und Script (rwx,r-x,r-x) vergessen.... und beides gehört root.

Hth.

Antworten