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

関連情報