Shell-Script

如果出現錯誤,請重新啟動並重新啟動腳本

  • November 12, 2021

我有一個腳本(不是我寫的,我無法修改它)必須執行數天,有時會失敗(退出並出現錯誤)。

在這種情況下,我所要做的就是重新啟動伺服器(目前沒有更好的解決方案),然後重新啟動腳本。目前我這樣做:

  • 通過 SSH 登錄
  • screen -S job
  • ./myscript.sh開始工作(假設這個腳本只包含:dothis並且這個過程可能會因錯誤而退出)
  • CTRL A,D與螢幕分離
  • ……等幾個小時……
  • 登錄,使用 恢復螢幕screen -r job

如果仍在執行,請分離並稍後返回。

如果腳本失敗,sudo reboot請從第 1 步開始,以使長期作業繼續進行。

如何在沒有人工干預的情況下做到這一點?

如果腳本存在錯誤,如何自動執行此操作並讓伺服器自動重新啟動,然後重新啟動腳本?

首先,我會嘗試將該腳本放入容器中。這將刪除主機本身的一些依賴項,並允許自動重啟。

使用 docker 和 docker-compose 的解決方案

這種方法需要 docker 和 docker compose。如果你有 Ubuntu,你可以通過sudo apt install docker.io docker-compose.

  1. 創建一個 Dockerfile 來建構您的容器,例如:
FROM ubuntu
COPY /path/to/script/on/host /myscript.sh
# maybe deal with some dependencies here
CMD /bin/bash /myscript.sh

將上述命名為Dockerfile任何文件夾。您可以在https://docs.docker.com/engine/reference/builder/查看一些文件

  1. 創建一個 docker-compose.yml
version: "3.9"
services:
 scriptrunner:
   build: .
   restart: always

將其放置docker-compose.yml在與Dockerfile**相同的目錄中。**在此處查看一些文件:https ://docs.docker.com/compose/compose-file/compose-file-v3/

我假設您想獲得腳本的一些輸出,在這種情況下,您可能必須設置 docker 卷以在主機和容器之間“共享”文件夾。

  1. 轉到終端中的文件夾並鍵入docker-compose up -d.

使用此方法,您將腳本放入容器中,在每個腳本失敗後重新啟動容器,並將作為守護程序執行。

使用 systemd 的解決方案

如果您不想處理容器,可以將腳本包裝在另一個容器中,例如my-runner.sh.

#!/bin/bash
/path/to/my-script.sh || systemctl reboot

這將在腳本失敗後重新啟動您的電腦。請注意,重新啟動可能需要不同的命令或 root 權限。

現在,讓我們為執行腳本創建一個 systemd 服務。是一個很好的教程,但歸結為以下幾點:

創建一個類似的systemd單元文件/etc/systemd/system/my-script.service並將以下內容放入其中。

[Unit]
Description=my script runner service
After=network.target
Type=simple
User=my-user
ExecStart=/path/to/the/previous/my-runner.sh

[Install]
WantedBy=multi-user.target

現在您只需發出systemcl start my-script && systemctl enable my-script啟動它並在重新啟動後啟動它。

引用自:https://unix.stackexchange.com/questions/677191