Вводная

Привет. Я не являюсь разработчиком и когда набросал простой скрипт для личных целей, задался вопросом: «Как запустить код не на своем компьютере?». Самые частые ответы в поисковике были про сервер и Docker. В результате забил гвоздь микроскопом. Почитать можно здесь.

Для специалистов с опытом статья наверное не имеет ценности, но новичкам надеюсь поможет сориентироваться и не потратить много часов на поиск информации и не совершать моих ошибок.

Варианты

Все ниже перечисленные способы подходят для несложного скрипта. Например, мой код для сборки статистики с группы VK, каждый час выполняет работу и завершается. Подробности тут.

Именно о запуске не сложных программ пойдет речь. Решения:

Облачное:

  • Yandex Functions и пр.

VPS сервер:

  • Python

  • Crontab

  • Systemd

  • Docker

Облачные решения

Простой скрипт и простое решение. Все необходимое есть и не нужно возиться с сервером.

Yandex Functions

Достаточно зарегистрироваться. Перейти в консоль, потратить время на документацию, перенести свой код и настроить таймеры. В функционал уже встроены логирование и мониторинг.

Продукт

Пример настройки и запуска

Что по деньгам? Бесплатно можно выполнять 1 000 000 раз в месяц. Что думаю более чем достаточно для небольших задач.

Пример работы с Yandex Functions
Пример работы с Yandex Functions

Существуют аналогичные заморские решения Amazon Lambda, Google Cloud Functions, Azure Functions. С учетом действующих ограничений не вижу смысла дополнительно тратить время на преодоления всех препятствий, когда результат принципиально не будет отличаться. Если есть желание разобраться оставлю ссылки на пример работы:

Amazon Lambda

Google Cloud Functions

VPS сервер

Аренда сервера мне кажется избыточным решением для запуска одного простого скрипта. Это оправдано в случае если есть желание разобраться как взаимодействовать с сервером или в будущем будите разрабатывать более сложные проекты.

Для настройки связи вашего сервера с локальной машиной, вам нужно будет настроить SSH. Если вы часто планируете вносить изменения в код для переноса файлов рекомендую настроить Github это решение удобное и практичное.

Настройки:

  • SSH с 1:05:23 до 1:08:25

  • Github с 1:10:17 до 1:14:32

Видео

В качестве альтернативы Github можно установить себе FileZilla Client. GUI позволяет удобно перетаскивать необходимые файлы и папки. Так же можно копировать файлы используя только командную строку.

Python

Простой способ применить бесконечный цикл с задержкой времени непосредственно в скрипте. Пример на имитации часов.

import time

while True:
  localtime = time.localtime()
  result = time.strftime("%I:%M:%S %p", localtime)
  print(result)
  time.sleep(1)

Второй способ сделать то же самое используя библиотеку schedule. Эта библиотека дает возможность более гибко настроить время исполнения кода. Например, ваш скрипт должен запускаться каждую субботу в 6 часов.

import schedule
import time

def job():
    localtime = time.localtime()
    result = time.strftime("%I:%M:%S %p", localtime)
    print(result)

schedule.every().sunday.at("06:00").do(job)

while True:
    schedule.run_pending()

У зацикливания есть ощутимый минус если программа упадет, то самостоятельно в следующей период она не запуститься.

Crontab

Немного сложнее, чем цикл в самом коде. Вам придётся поработать с командой строкой и в самом файле сrontab прописать, когда и какой файл запускать. Если у вас произойдет ошибка, не связанная с вашим кодом, например, упадет внешний API сервиса к которому вы обращаетесь, то в следующий период запуска, когда API будет восстановлен ваш скрипт отработает. Минусом является очень слабое логирование, поэтому понять в каком конкретно месте падает скрипт достаточно сложно.

Хорошая статья про cron

Systemd

Более трудозатратный способ по сравнению с crontab. Вам придётся потратить время на создание 2-х файлов. Плюсы гибкая настройка времени, условий выполнения и широкое логирование. Вы сможете увидеть ошибку с который упал код.

Статья

Docker

Избыточное решение для запуска простого скрипта, тем не менее им тоже можно воспользоваться. В первую очередь вы потратите много времени на установку docker и его настройку. Если у вас простой код, то решение с docker скорее всего не принесет дополнительной ценности кроме опыта работы.

Вывод

Надеюсь статья поможет новичкам и сэкономит их время. Оставляйте комментарии, если считаете, что существуют еще инструменты для запуска простых скриптов. Буду стараться дополнять статью опираясь на вашу обратную связь.

Комментарии (6)


  1. NewSouth
    09.08.2023 05:12
    +2

    У зацикливания есть ощутимый минус если программа упадет, то самостоятельно в следующей период она не запуститься.

    Поэтому лучше использовать APSCheduler:

    from apscheduler.schedulers.background import BlockingScheduler
    
    # Creates a default Background Scheduler
    sched = BlockingScheduler()
    
    def prompt():
        print("Executing Task...")
    
    sched.add_job(prompt,'interval', seconds=5)
    
    sched.start()

    ... который лишен этого недостатка + куча других плюшек по типу работы с асинхронным кодом.

    VPS сервер Аренда сервера мне кажется избыточным решением... 

    На самом деле, это - самый очевидный и хороший вариант решения. Никогда не знаешь, насколько поднимут плату всякие Yandex Functions и остальные.

    Статья была бы полезной, если автор хотя бы рассказал про установку библиотек и работу скрипта в виртуальной среде типа venv - это очень нужно для работы на VPS серверах. Докер для одного скрипта - действительно избыточно.


    1. DmitriyB_33 Автор
      09.08.2023 05:12

      Благодарю за комментарий. На выходных дополню статью.


  1. Sequoza
    09.08.2023 05:12

    Пользуясь случаем, немного пооффтоплю. Можно ли скрипты отлаживать с удаленной машины? Нет ли что-либо похожего на gdb server?


    1. IronHead
      09.08.2023 05:12

      PyCharm умеет удаленную отладку по ssh


      1. 4Droidek
        09.08.2023 05:12

        Платная версия PyCharm имеет.

        Бесплатно можно ssh использовать с VSCode.

        А если на гуи не нужны, то можно просто через консоль + vim/nano. Не сказал бы что неудобно. Тем более vim (не vi !) имеет возможность открыть несколько сессий одновременно. Считай почти как у IDE вкладки.


  1. Radio7
    09.08.2023 05:12

    pythonanywhere - дёшево и сердито.