А крон Работа – это способ запуска программы на сервере с указанным интервалом. Это часто небольшой скрипт, который делает некоторую повторяющуюся задачу, например, собирать метрики, проверять здоровье обслуживания, состоится снимка какого-то набора данных и т. Д.
Утилита CRON имеет очень настраиваемый формат, называемый файлом Crontab, который позволяет нам работать по существу любую команду на любой интервал, который мы хотим. Вы можете провести свой скрипт так часто, как раз в минуту, а как нечасто как раз в год.
Чаще всего работа CRON требует некоторого ввода, делает небольшую обработку, а затем генерирует некоторый вывод. Вход может быть веб-страница, другая приложение, база данных и т. Д. Вывод может быть что угодно, от добавления строки в таблицу в базе данных, чтобы поместить файл в хранилище, для отправки сообщения.
Джобс Cron есть Лот Из применений: по сути все, что вы хотите произойти в повторяемом способом, можно превратить в работу CRON.
Одна вещь, которую я люблю использовать Cron Jobs для того, чтобы следить за веб-сайтами, которые я вижу нечасто. Например, я хотел бы увидеть статьи, размещенные в Hacker News О Serverless, но у меня нет времени, чтобы проверить это каждый день и посмотреть на звание каждого поста, чтобы увидеть, если речь идет о Python.
Вместо этого я могу написать работу Cron, чтобы сделать это для меня. Шаги будут примерно следующими:
- Раз в день получите лучшие истории от API;
- Итайте за каждую историю;
- Если какой-либо из их названий совпадает «Serverless»:
- Отправить письмо со ссылками
Вот сценарий:
#!/usr/bin/python import requests from utils import send_email api_url = 'https://hacker-news.firebaseio.com/v0/' top_stories_url = api_url + 'topstories.json' item_url = api_url + 'item/{}.json' def scan_hacker_news() # Make a request to the API top_stories = requests.get(top_stories_url).json() serverless_stories = [] # Iterate over every story for story_id in top_stories: story = requests.get(item_url.format(story_id)).json() if 'serverless' in story['title'].lower(): serverless_stories.append(story) # If there are any, send an email if serverless_stories: send_email(serverless_stories)
Это делает запрос на API, итерацию за каждую историю, фильтрует истории, которые имеют «безверенно» в заголовке, и отправляет мне электронное письмо (мы оставим эту функцию как упражнение для читателя).
Если бы я хотел настроить эту работу в качестве работы на моем машине Linux, я бы сохранил его в файл ( send_me_pythons.py
), сделайте его исполняемым ( chmod 755 send_me_pythons.py
) и положить его В моем местном bin ( /usr/local/bin/send_me_pythons.py
).
Затем я редактирую свой Crontab ( /etc/crontab
) и добавьте следующую строку:
0 0 * * * /usr/local/bin/send_me_pythons.py
Это запускает сценарий один раз в день в полночь. Мне нравится использовать https://crontab.guru/ Чтобы убедиться, что мой Crontab правильно, прежде чем установить его. Вот диаграмма каждого поля:
# 0 0 * * * /usr/local/bin/send_me_pythons.py # │ │ │ │ │ └── run this script # │ │ │ │ └──── every year # │ │ │ └────── every month # │ │ └──────── every day # │ └────────── at hour zero # └──────────── at minute zero
Как только Crontab установлен, моя машина заберет на новой задании CRON и запустить ее так часто, как я уже указывал.
Это здорово, но у него есть один огромный недостаток: теперь я должен держать свой сервер и запустить, чтобы убедиться, что электронные письма отправляются, в противном случае я буду вести ценный контент без сердечности. И это еще более осложняется тем, что либо я должен использовать этот сервер для других вещей, кроме того, что раз в день выполнял этот маленький скрипт один раз в день, или мне нужно держать весь сервер и запустить только для этого маленького сценария! Не идеально.
Вместо этого давайте возьмем эту функцию в облако. Во-первых, мы превратим его в Функция Google Cloud Отказ Мы уничтожим весь наш существующий скрипт в функции Python и поместите его в файл под названием main.py
:
import requests from utils import send_email api_url = 'https://hacker-news.firebaseio.com/v0/' top_stories_url = api_url + 'topstories.json' item_url = api_url + 'item/{}.json' def send_pythons(request): # Make a request to the API top_stories = requests.get(top_stories_url).json() serverless_stories = [] # Iterate over every story for story_id in top_stories: story = requests.get(item_url.format(story_id)).json() if 'serverless' in story['title'].lower(): serverless_stories.append(story) # If there are any, send an email if serverless_stories: send_email(serverless_stories)
Примечание: Только линии, которые должны случиться каждый раз, функция называется фактически должна быть в send_pythons
функция. Операторы импорта необходимо выполнить только один раз, когда функция загружается, и можно оставить вне функции.
Далее мы определим наши зависимости. Мы используем Запросы
поэтому нам нужно поставить его в нашу требования .txt
:
requests==2.20.0
Затем мы можем развернуть это с gcloud
Инструмент командной строки:
$ gcloud beta functions deploy test --runtime python37 --trigger-http
Это даст нам конечную точку, что-то вроде:
https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons
И сделать http Получить
Запрос на эту конечную точку приведет к запуску нашей функции.
Теперь у нас есть наш скрипт как функция в облаке, все, что нам нужно сделать, это запланировать. Мы можем создать новую работу планировщика Google Cloud с gcloud
Инструмент командной строки:
$ gcloud beta scheduler jobs create http send_pythons_job \ --schedule="0 0 * * *" \ --uri=https://us-central1-[PROJECT_ID].cloudfunctions.net/send_pythons
Это указывает имя для нашей работы send_pythons_job
, который является уникальным в рамках проекта. Он также указывает график Crontab, который мы установили выше, и указывает на работу нашей функции HTTP, которую мы создали.
Мы можем перечислить нашу работу:
$ gcloud beta scheduler jobs list --project=$PROJECT ID LOCATION SCHEDULE (TZ) TARGET_TYPE STATE send_pythons_job us-central1 0 0 * * * (Etc/UTC) HTTP ENABLED
И если мы хотим запустить нашу работу вне расписания, мы можем сделать это из командной строки:
$ gcloud beta scheduler jobs run send_pythons_job
Есть много большего, вы можете сделать с облачными функциями + планировщика облака! Следуйте по ссылкам ниже, чтобы узнать, как:
- Расписание более сложных задач с облачным планировщиком
- Используйте планировщик облаков и PUB/SUB, чтобы вызвать функцию облака
- Отправить письмо от App Engine с Mailjet или Sendgrid
Все код © Google W/Apache 2 лицензия
Оригинал: “https://dev.to/googlecloud/moving-your-cron-job-to-the-cloud-with-google-cloud-functions-1ecp”