Как можно возобновить выполнение скрипта с того места, где он остановился после возобновления в Linux Ubuntu? Можно ли как-то использовать rc.local?

Как можно возобновить выполнение скрипта с того места, где он остановился после возобновления в Linux Ubuntu? Можно ли как-то использовать rc.local?

Как можно использовать rc.local для возобновления работы скрипта после возобновления?

Некоторые пояснения из комментария пользователя:

Boot_desired_kernel() {} 
# after this system will reboot 
Do_task(){} 
Do_task() /*

Вставка файла в init.d и его обновление работают для запуска скрипта после перезагрузки, но я ожидаю, что скрипт должен начаться с того места, где он остановился перед перезагрузкой.

решение1

Я не знаю, как это сделать с помощью rc.local, но, возможно, вас устроит systemdспособ:

  • Создайте новую службу systemd:

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

    Вы можете nanoвместо этого или вставить vim.tinyдругой понравившийся вам редактор :

    [Unit]
    Description=Start script after resume
    After=suspend.target
    
    [Service]
    Type=simple
    ExecStart=/full/path/to/the/script.sh
    
    [Install]
    WantedBy=suspend.target
    
  • Включите и запустите службу:

    sudo systemctl enable startscript && sudo systemctl start startscript
    

решение2

Я не знаю, как возобновить выполнение скрипта после перезагрузки, но вы можете проверить версию ядра, и если версия ядра вам нужна, вы можете выполнить остальную часть скрипта, пропустив часть смены ядра и перезагрузки, как в следующем скрипте. Но скрипт будет выполняться перед первой перезагрузкой и после каждой перезагрузки.

#!/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

После перезагрузки он пропускает этап выбора ядра, если текущее ядро ​​имеет требуемую версию, и выводит сообщение «Эта команда выполняется после перезагрузки до KERNEL_VERSION_HERE», если вы запускаете journalctl -b | grep Thisили:

$ journalctl -b | grep Currently
Apr 13 17:35:51 lenovo root[1013]: Currently running kernel version is: 5.3.0-40-generic

После добавления этого systemdон загружается с ядром по умолчанию, а затем автоматически перезагружается и загружается с ядром 5.3.0-40-generic.

$ 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

Связанный контент