Gibt es eine Möglichkeit, beim Herunterfahren ein Skript auszuführen, nachdem das Dateisystem erneut schreibgeschützt gemountet wurde?
Ich habe einen Raspberry Pi an eine drahtlose Steckdose angeschlossen, die ich über einen Sender und ein Skript steuern kann. Ich möchte diese Steckdose (und damit auch den Raspberry) beim Herunterfahren ausschalten, nachdem das Dateisystem schreibgeschützt gemountet wurde.
Ich habe Folgendes versucht:
[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/test
KillMode=none
[Install]
WantedBy=halt.target
Das Skript /test gibt die aktuellen Mounts aus. Wenn es beim Herunterfahren ausgeführt wird, wird für das Root-Dateisystem Lese-/Schreibzugriff angezeigt und nicht wie erwartet nur Lesezugriff.
Bearbeiten:
Inhalt von /test:
#!/bin/bash
echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1
Bildschirmausgabe beim Herunterfahren:
Antwort1
Ich habe eine zuverlässige Lösung gefunden: Legen Sie das Skript einfach in /usr/lib/systemd/system-shutdown/ ab.
Siehe auch:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Unmittelbar vor der Ausführung des eigentlichen Systemhalts/-ausschaltens/-neustarts/-kexec führt systemd-shutdown alle ausführbaren Dateien in /usr/lib/systemd/system-shutdown/ aus und übergibt ihnen ein Argument: entweder „halt“, „poweroff“, „reboot“ oder „kexec“, abhängig von der gewählten Aktion. Alle ausführbaren Dateien in diesem Verzeichnis werden parallel ausgeführt und die Ausführung der Aktion wird nicht fortgesetzt, bevor alle ausführbaren Dateien beendet sind.
Antwort2
Was Ihr ursprüngliches Skript betrifft, wird es normalerweise vor halt.target ausgeführt (beachten Sie, dass Sie es nicht vor halt.target angeordnet haben) – und Dateisysteme werden an diesem Punkt nie erneut gemountet. systemd-shutdown (das systemd ganz am Ende ausführt – nach Erreichen von halt.target) beendet Dinge (möglicherweise zusammen mit Ihrem nicht angeordneten Skript =)), führt ein abschließendes umount/swapoff/losetup aus, mountet erneut, was nicht umountet werden konnte, führt dann parallel Dinge aus dem System-Shutdown-Verzeichnis aus, versucht dann, pivot_root() in /run/initrams auszuführen, wenn shutdown dort vorhanden ist (und fährt mit halt fort, wenn dies nicht der Fall ist oder Pivot fehlschlägt).