![Linux Ubuntu で再開後にスクリプトを中断したところから再開するにはどうすればよいでしょうか? rc.local を利用できるでしょうか?](https://rvso.com/image/922436/Linux%20Ubuntu%20%E3%81%A7%E5%86%8D%E9%96%8B%E5%BE%8C%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%B8%AD%E6%96%AD%E3%81%97%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D%E3%81%8B%E3%82%89%E5%86%8D%E9%96%8B%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F%20rc.local%20%E3%82%92%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%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