![Как можно возобновить выполнение скрипта с того места, где он остановился после возобновления в Linux Ubuntu? Можно ли как-то использовать rc.local?](https://rvso.com/image/922436/%D0%9A%D0%B0%D0%BA%20%D0%BC%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%B2%D0%BE%D0%B7%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D1%81%20%D1%82%D0%BE%D0%B3%D0%BE%20%D0%BC%D0%B5%D1%81%D1%82%D0%B0%2C%20%D0%B3%D0%B4%D0%B5%20%D0%BE%D0%BD%20%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D0%BB%D1%81%D1%8F%20%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%20%D0%B2%D0%BE%D0%B7%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%20Linux%20Ubuntu%3F%20%D0%9C%D0%BE%D0%B6%D0%BD%D0%BE%20%D0%BB%D0%B8%20%D0%BA%D0%B0%D0%BA-%D1%82%D0%BE%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20rc.local%3F.png)
Как можно использовать 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