我有一个脚本(不是我写的,我无法修改它)必须运行数天,有时会失败(退出并出现错误)。
在这种情况下,我所要做的就是重新启动服务器(目前没有更好的解决方案),然后重新启动脚本。目前我这样做:
通过 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
任何文件夹。您可以在https://docs.docker.com/engine/reference/builder/查看一些文档将其放置
docker-compose.yml
在与Dockerfile相同的目录中。在此处查看一些文档:https ://docs.docker.com/compose/compose-file/compose-file-v3/我假设您想获得脚本的一些输出,在这种情况下,您可能必须设置 docker 卷以在主机和容器之间“共享”文件夹。
docker-compose up -d
.使用此方法,您将脚本放入容器中,在每个脚本失败后重新启动容器,并将作为守护进程运行。
使用 systemd 的解决方案
如果您不想处理容器,可以将脚本包装在另一个容器中,例如
my-runner.sh
.这将在脚本失败后重新启动您的计算机。请注意,重新启动可能需要不同的命令或 root 权限。
现在,让我们为运行脚本创建一个 systemd 服务。这是一个很好的教程,但归结为以下几点:
创建一个类似的systemd单元文件
/etc/systemd/system/my-script.service
并将以下内容放入其中。现在您只需发出
systemcl start my-script && systemctl enable my-script
启动它并在重新启动后启动它。