- Запускаем Python-скрипт на сервере, чтобы он работал всё время
- Коротко — суть
- Предварительная работа
- Отправляем скрипт на сервер
- Готовим файл для работы службы
- Запуск службы
- Что дальше
- Как управлять службами Systemd на удаленном сервере Linux
- запуск сервисов удаленно
- Ну IPMI это практически доступ локально. 🙂
- Как запустить, остановить и перезапустить сервисы в Linux
- Базовый синтаксис команды systemctl
- Как проверить, работает ли служба в Linux
- Как перезапустить сервис
- Как перезагрузить конфигурационные файлы сервиса
- Как запустить сервис
- Как остановить сервис
- Как включить сервис при загрузке
- Как отключить сервис при загрузке
Запускаем Python-скрипт на сервере, чтобы он работал всё время
В итоге мы остановились на том, что научились запускать скрипт на сервере, чтобы он работал после разрыва соединения. Но это половинчатое решение: если мы перезапустим сервер, то бот остановится. Иногда сервер перезагружается сам на стороне провайдера, например при плановых технических работах. И тогда наши скрипты умирают.
Сейчас нам нужно такое решение, чтобы бот автоматически перезапускался при любых обстоятельствах. Этим и займёмся.
Коротко — суть
Чтобы было понятно, что тут происходит, вот короткая версия:
- Настраиваем удалённый доступ к серверу.
- Создаём папку и заливаем в неё скрипт, который в итоге должен будет работать всё время.
- Создаём у себя на компьютере файл службы — он управляет настройками автозапуска скрипта.
- Отправляем файл службы на сервер.
- Обновляем на сервере данные обо всех службах и запускаем нашу.
Теперь подробно про каждый шаг.
Предварительная работа
Основное, что мы будем использовать, — это удалённый доступ к серверу по SSH. Для этого он должен быть включён на самом сервере, и там же можно сразу посмотреть параметры доступа. Например, для работы нашего учебного сервера мы пользуемся услугами SpaceWeb, где доступ по SSH включается из панели управления:
Запускаем SSH и проверяем, что соединение устанавливается. Чтобы соединиться, нужно написать в терминале команду ssh имя_пользователя@адрес_сервера, после чего нажать Enter. Сервер спросит пароль, и, если мы его правильно ввели, нас пустят.
Мы видим приветствие сервера, значит, всё прошло хорошо и мы можем управлять им со своего компьютера. Для этого нужно будет писать в терминал команды и реагировать на то, что тебе ответит сервер.
Отправляем скрипт на сервер
Чтобы не захламлять корневую папку на сервере, создадим новую папку bot. Вот эта команда:
После этого открываем новую командную строку на компьютере, а не на сервере. Для этого нужно запустить ещё одно окно терминала. Там пишем такое:
scp /Users/mihailpolanin/Downloads/bot.py mpolyanin@77.222.61.9:bot
- scp — копирование файла по SSH;
- /Users/mihailpolanin/Downloads/bot.py — это путь к нашему скрипту на компьютере. Его замените на то, что будет у вас;
- mpolyanin@77.222.61.9 — адрес сервера и логин пользователя. Это тоже замените на ваши данные;
- : — отделяет сервер от папки;
- bot — название папки, которую мы только что создали на сервере.
Лайфхак: чтобы не писать вручную пути до файлов на локальном компьютере, можно перед началом ввода пути просто перетащить файл в окно терминала. Терминал поймёт, что вы имели в виду «путь до этого файла», и подставит данные сам.
После запуска у нас попросят пароль от сервера — вводим его и видим статистику отправки файла:
Переключаемся обратно в SSH-соединение и проверяем, что файл скопировался и лежит в папке. Для этого вводим две команды: первая перейдёт в эту папку, а вторая покажет её содержимое:
Готовим файл для работы службы
Нам нужно, чтобы система сама следила за тем, чтобы скрипт работал всё время и запускался после перезагрузки. В Linux за это отвечают службы — одну из таких служб мы сейчас и сделаем.
Создаём на компьютере новый файл bot.service и вставляем туда такое:
[Unit] Description=tg-bot After=multi-user.target [Service] User=root Group=root Type=simple Restart=always ExecStart=/usr/bin/python3 /bot/bot.py [Install] WantedBy=multi-user.target
Два самых важных параметра — это путь к нашему скрипту (/bot/bot.py) и название службы: tg-bot. Название может быть любым, а вот путь к скрипту нужно указать точно.
Теперь закидываем этот файл на сервер в папку /usr/lib/systemd/system. Для этого в командной строке компьютера пишем:
scp /Users/mihailpolanin/Downloads/bot.service mpolyanin@77.222.61.9:/usr/lib/systemd/system
Как и раньше, не забудьте заменить адрес до файла .service на вашем компьютере, а также имя пользователя и адрес сервера. Первый адрес можно не писать вручную, а перетащить файл в терминал сразу после набора команды scp.
Запуск службы
Теперь нам нужно перезагрузить все службы, чтобы наш файл тоже попал в общий список для запуска. Открываем SSH-консоль и выполняем там такую команду:
sudo systemctl daemon-reload
И сразу включим наш сервис, чтобы он не отключался при перезагрузке сервера:
sudo systemctl enable bot.service
Всё, можно запускать наш телеграм-бот как службу. Вот основные команды для этого:
- sudo systemctl start bot.service — запустить службу;
- sudo systemctl stop bot.service — остановить службу;
- sudo systemctl status bot.service — посмотреть статус, работает или нет.
Что дальше
В следующий раз сделаем ещё круче — настроим систему мониторинга на сервере, чтобы нам на почту приходило сообщение, когда служба перезапускается или останавливается с ошибкой. Подпишитесь, чтобы не пропустить.
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Как управлять службами Systemd на удаленном сервере Linux
Диспетчер системы и служб Systemd можно контролировать с помощью утилиты командной строки systemctl. Он позволяет вам управлять systemd локально или на удаленной машине Linux по протоколу SSH.
В этой короткой статье мы покажем вам, как управлять системой systemd и диспетчером служб на удаленной машине Linux через сеанс SSH.
Внимание. Мы рекомендуем использовать пары открытого и закрытого ключей для аутентификации без пароля для SSH, в отличие от паролей, а также использовать дополнительные методы для защиты службы SSH, как описано выше. в этих справочниках.
- Беспарольный вход по SSH с помощью SSH Keygen за 5 простых шагов
- 5 рекомендаций по безопасности и защите SSH-сервера
- Как заблокировать доступ по SSH и FTP к определенному IP-адресу и сетевому диапазону
Чтобы подключиться к удаленному серверу, запустите systemctl с флагом —host или -H следующим образом. В приведенной ниже команде мы подключаемся к удаленному серверу как пользователь root, а status — это подкоманда утилиты systemctl, используемая для просмотра состояния httpd [Ctrl+C] . Дополнительную информацию и варианты использования см. на справочной странице systemctl:
Это пока все! Далее следует подборка статей по systemd, которые могут быть вам полезны:
- История: почему init нужно было заменить на systemd в Linux
- Управление процессом запуска системы и службами (SysVinit, Systemd и Upstart)
- Управление сообщениями журнала в Systemd с помощью Journalctl [подробное руководство]
- Как создавать и запускать новые сервисные единицы в Systemd с помощью сценария оболочки
- Как изменить уровни запуска (цели) в SystemD
В этой статье мы показали вам, как управлять системой systemd и диспетчером служб на удаленной машине Linux. Используйте раздел обратной связи, чтобы задать вопросы или поделиться своими мыслями об этом руководстве.
запуск сервисов удаленно
Добрый день! Случилось такая ситуация,сервис ssh по каким то причинам не запустился,и нет возможности зайти удаленно, есть возможность его запустить удаленно?
Конечно есть, позвони по телефону человеку, который находится рядом с сервером, скажи пароль root и попроси перезапустить ssh сервис, ну либо позвони электрикам и попроси вырубить питание в серверной на время достаточное для разрядки UPS и включить затем.
kostik87 ★★★★★ ( 13.07.16 09:59:07 MSK )
Последнее исправление: kostik87 13.07.16 09:59:20 MSK (всего исправлений: 1)
К примеру на консоль локально нет возможности тоже попасть.
Вырубай электричество, затем надейся что при загрузке ОС всё поднимется.
Зайти по IPMI, если есть. Или попросить персонал в DC подключить KVM временно. Или если есть remote reset service — ребутнуть машинку и грызя локти надеятся, что в этот раз запустится.
Ну IPMI это практически доступ локально. 🙂
если товарищь в курсе, что это такое. Снимаю шляпу, про это даже не вспомнил, неужели у кого то есть на линуксовых тачках это?
По крайней мере на всех SuperMicro бордах оно встроенное.
И да, мы не знаем, о каком компе речь идёт. Сервер в DC? Замурованый в стену mikrotik? Комп бухгалтера на дельнем севере?
beastie ★★★★★ ( 13.07.16 13:06:56 MSK )
Последнее исправление: beastie 13.07.16 13:09:09 MSK (всего исправлений: 1)
обычно это значит что ОС вместо того чтобы грузиться просит пароль рута для проверки диска 8)
Ситуация решается подключением монитора и фотографированием экрана — т.к. если ребята сами не смогли исправить, значит правильно описать находящееся на экране тоже не смогут.
Перезагружать нельзя, на практике встречались такиже жопы с ручками который, видимо танцевали на ресете пока сервер окончательно не сдыхал (утром сервер что-то писал на экране, щас мы вам скинем фотографию, вечером — ой мы ничего не делали а он не не включается).
обычно это значит что ОС вместо того чтобы грузиться просит пароль рута для проверки диска 8)
С большей вероятностью это значит, что с апдейтами прилетел systemd. ж)
И да, fsck может длится очень долго. А может и отвалится на пол-дороги.
а fsck может вообще сам не запускаться а требовать пароль рута, зависит от дистра и настроек, у нас чаще именно из-за этого случались факапы
Вообщем выключили включили, и все ровно ssh сервис не поднимается и зайти даже локально нет возможности.
зайти даже локально нет возможности
Как запустить, остановить и перезапустить сервисы в Linux
Linux обеспечивает детальный контроль над системными службами через systemd с помощью команды systemctl. Службы могут быть включены, выключены, перезапущены, перезагружены или даже включены или отключены при загрузке. Если вы используете Debian, CentOSили Ubuntu, ваша система, вероятно, использует systemd.
Это руководство покажет вам, как использовать основные команды для запуска, остановки и перезапуска служб в Linux.
Базовый синтаксис команды systemctl
Основной синтаксис для использования команды systemctl:
systemctl [command] [service_name]
Как правило, вам нужно запускать это как суперпользователь поэтому команды будут начинаться с sudo.
Как проверить, работает ли служба в Linux
Чтобы проверить, активна ли служба или нет, выполните следующую команду:
sudo systemctl status SERVICE_NAME
Замените SERVICE_NAME на нужный сервис.
В нашем случае мы будем брать за пример веб-сервер Apache.
Интересный факт: в Ubuntu и других дистрибутивах на основе Debian служба Apache называется apache2. В CentOS и других дистрибутивах RedHat служба Apache называется httpd или httpd.service
sudo systemctl status apache2
Так мы проверили состояние Apache. Выходные данные показывают, что служба активна (работает), как на рисунке ниже:
Как перезапустить сервис
Чтобы остановить и перезапустить службу в Linux, используйте команду:
sudo systemctl restart SERVICE_NAME
Где SERVICE_NAME — имя вашего сервиса.
После выполнения команды ваш сервис должен снова заработать. Вы можете проверить состояние с помощью команды status
Для перезапуска нашего сервера Apache используем:
sudo systemctl restart apache2
Как перезагрузить конфигурационные файлы сервиса
Чтобы служба перезагрузила свои файлы конфигурации, введите в терминале следующую команду:
sudo systemctl reload SERVICE_NAME
После перезагрузки проверьте ее состояние командой status для подтверждения.
В нашем примере мы перезагрузили Apache, используя:
sudo systemctl reload apache2
Как запустить сервис
Чтобы запустить службу в Linux вручную, введите в терминале следующее:
sudo systemctl start SERVICE_NAME
Например, команда для запуска службы Apache:
sudo systemctl start apache2
Как остановить сервис
Чтобы остановить активную службу в Linux, используйте следующую команду:
sudo systemctl stop SERVICE_NAME
Для нашего апача используем команду
sudo systemctl stop apache2
Проверьте, остановился ли сервис с помощью команды status . Вывод должен показать, что сервис неактивен — inactive (dead)
Как включить сервис при загрузке
Чтобы настроить службу для запуска при загрузке системы, используйте команду:
sudo systemctl enable SERVICE_NAME
Чтобы включить Apache при загрузке системы, выполните команду:
sudo systemctl enable apache2
Как отключить сервис при загрузке
Вы можете запретить запуск службы при загрузке с помощью команды:
sudo systemctl disable SERVICE_NAME
sudo systemctl disable apache2