Wie können wir das Skript nach der Wiederaufnahme in Linux Ubuntu dort fortsetzen, wo es aufgehört hat? Können wir rc.local irgendwie nutzen?

Wie können wir das Skript nach der Wiederaufnahme in Linux Ubuntu dort fortsetzen, wo es aufgehört hat? Können wir rc.local irgendwie nutzen?

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 systemddieser Methode zufrieden:

  • Erstellen Sie den neuen systemd-Dienst:

    sudo vim.tiny /etc/systemd/system/startscript.service
    

    Sie können nanostattdessen vim.tinyoder 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 Thisoder:

$ 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 systemdwird 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

verwandte Informationen