
Wie kann rc.local verwendet werden, um das Skript nach der Wiederaufnahme fortzusetzen?
Einige Erklärungen aus dem Benutzerkommentar:
Boot_desired_kernel() {}
# after this system will reboot
Do_task(){}
Do_task() /*
Das Einfügen der Datei in init.d und das Aktualisieren funktioniert, damit das Skript nach dem Neustart ausgeführt wird. Ich erwarte jedoch, dass das Skript dort fortgesetzt wird, wo es vor dem Neustart aufgehört hat.
Antwort1
Ich weiß nicht, wie das geht rc.local
, aber vielleicht sind Sie mit systemd
dieser Methode zufrieden:
Erstellen Sie den neuen systemd-Dienst:
sudo vim.tiny /etc/systemd/system/startscript.service
Sie können
nano
stattdessenvim.tiny
oder mit einem anderen Editor Ihrer Wahl
Folgendes einfügen:[Unit] Description=Start script after resume After=suspend.target [Service] Type=simple ExecStart=/full/path/to/the/script.sh [Install] WantedBy=suspend.target
Aktivieren und starten Sie den Dienst:
sudo systemctl enable startscript && sudo systemctl start startscript
Antwort2
Ich weiß nicht, wie ich die Skriptausführung nach dem Neustart fortsetzen kann, aber Sie könnten die Kernelversion prüfen und wenn die Kernelversion die ist, die Sie benötigen, könnten Sie den Rest des Skripts ausführen und dabei den Teil überspringen, in dem der Kernel geändert und neu gestartet wird, wie im nächsten Skript. Das Skript wird jedoch vor dem ersten Neustart und nach jedem Neustart ausgeführt.
#!/bin/bash
kernel="5.3.0-40-generic"
if [[ $(uname -a) != *$kernel* ]]; then
kernlist="$(grep -i "menuentry '" /boot/grub/grub.cfg|sed -r "s|--class .*$||g")"
printf "%s$kernlist\n" | logger
menuline="$(printf "%s$kernlist\n"|grep -ne $kernel | grep -v recovery | cut -f1 -d":")"
menunum="$(($menuline-2))"
grub-reboot "1>$menunum"
echo "The next grub's menu entry will be choosen after the reboot:\n 1>$menunum" | logger
reboot
fi
if [[ $(uname -a) == *$kernel* ]];
then echo "This command is executed after reboot to $kernel" | logger;
fi
echo "Currently running kernel version is: $(uname -r)" | logger
Nach dem Neustart wird die Ausführung des Kernelauswahlteils übersprungen, wenn der aktuelle Kernel die erforderliche Version hat, und es wird die Meldung „Dieser Befehl wird nach dem Neustart mit KERNEL_VERSION_HERE ausgeführt“ ausgegeben, wenn Sie Folgendes ausführen journalctl -b | grep This
oder:
$ journalctl -b | grep Currently
Apr 13 17:35:51 lenovo root[1013]: Currently running kernel version is: 5.3.0-40-generic
Nach dem Hinzufügen systemd
wird es mit dem Standardkernel geladen, startet dann automatisch neu und bootet mit dem generischen Kernel 5.3.0-40.
$ cat /etc/systemd/system/resscript.service
[Unit]
Description=Start script after reboot
After=network.target
[Service]
Type=simple
ExecStart=/home/user/test/resscript.sh
[Install]
WantedBy=multi-user.target