如果出現錯誤,請重新啟動並重新啟動腳本
我有一個腳本(不是我寫的,我無法修改它)必須執行數天,有時會失敗(退出並出現錯誤)。
在這種情況下,我所要做的就是重新啟動伺服器(目前沒有更好的解決方案),然後重新啟動腳本。目前我這樣做:
- 通過 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
.
- 創建一個 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/查看一些文件
- 創建一個 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 卷以在主機和容器之間“共享”文件夾。
- 轉到終端中的文件夾並鍵入
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
啟動它並在重新啟動後啟動它。