在 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

journalctl -b | grep This重启后,如果当前内核是所需的版本,它会跳过运行内核选择部分,并且如果您运行或,则会回显“此命令在重启到 KERNEL_VERSION_HERE 后执行” :

$ 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

相关内容