![在 Linux Ubuntu 中恢復後如何從中斷處恢復腳本?無論如何,我們可以使用 rc.local 嗎?](https://rvso.com/image/922436/%E5%9C%A8%20Linux%20Ubuntu%20%E4%B8%AD%E6%81%A2%E5%BE%A9%E5%BE%8C%E5%A6%82%E4%BD%95%E5%BE%9E%E4%B8%AD%E6%96%B7%E8%99%95%E6%81%A2%E5%BE%A9%E8%85%B3%E6%9C%AC%EF%BC%9F%E7%84%A1%E8%AB%96%E5%A6%82%E4%BD%95%EF%BC%8C%E6%88%91%E5%80%91%E5%8F%AF%E4%BB%A5%E4%BD%BF%E7%94%A8%20rc.local%20%E5%97%8E%EF%BC%9F.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