Я бы провел стандартную проверку подключения к сети.
Если предполагается, что ssh-сервер находится в той же сети, что и вы, попробуйте пропинговать его. Однако если проверка связи прошла успешно, это не обязательно означает, что у вас есть полное IP-подключение. Убедитесь, особенно если сервер является виртуальной машиной, что MAC-адрес сетевого интерфейса (виртуального или реального )находится в той же vLAN, что и клиент. Если вы используете какую-либо форму тегирования пакетов, а не тегирование порта коммутатора, то в некоторых случаях коммутатор будет правильно передавать пакеты ICMP, но не пакеты TCP/UDP. Тот сводил меня с ума весь день.
Во-первых, я бы попытался поместить этот скрипт в контейнер. это удалит некоторые зависимости от самого хоста и разрешит автоматический перезапуск.
Решение с использованием docker и docker -compose
Для этого подхода требуется docker и docker compose. Если у вас Ubuntu, вы можете установить их через sudo apt install docker.io docker-compose
.
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/
version: "3.9"
services:
scriptrunner:
build:.
restart: always
Поместите это как docker-compose.yml
в тот же каталог , что и ваш Dockerfile. См. некоторые документы здесь:https://docs.docker.com/compose/compose-file/compose-file-v3/
Я предполагаю, что вы хотите получить какие-то выходные данные скрипта, и в этом случае вам, возможно, придется настроить тома докеров для «совместного использования» папок между вашим хостом и контейнером.
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
, чтобы запустить его и запустить после перезагрузки.