Перезагрузите и перезапустите скрипт в случае ошибки

Я бы провел стандартную проверку подключения к сети.

Если предполагается, что ssh-сервер находится в той же сети, что и вы, попробуйте пропинговать его. Однако если проверка связи прошла успешно, это не обязательно означает, что у вас есть полное IP-подключение. Убедитесь, особенно если сервер является виртуальной машиной, что MAC-адрес сетевого интерфейса (виртуального или реального )находится в той же vLAN, что и клиент. Если вы используете какую-либо форму тегирования пакетов, а не тегирование порта коммутатора, то в некоторых случаях коммутатор будет правильно передавать пакеты ICMP, но не пакеты TCP/UDP. Тот сводил меня с ума весь день.

0
12.11.2021, 09:11
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. Создать докер -compose.yml
version: "3.9"
services:
  scriptrunner:
    build:.
    restart: always

Поместите это как docker-compose.ymlв тот же каталог , что и ваш Dockerfile. См. некоторые документы здесь:https://docs.docker.com/compose/compose-file/compose-file-v3/

Я предполагаю, что вы хотите получить какие-то выходные данные скрипта, и в этом случае вам, возможно, придется настроить тома докеров для «совместного использования» папок между вашим хостом и контейнером.

  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, чтобы запустить его и запустить после перезагрузки.

1
12.11.2021, 14:59

Теги

Похожие вопросы