Run python script cron

How to Schedule Python Scripts With Cron — The Only Guide You’ll Ever Need

Automate your Python script execution — works on Linux and macOS

When it comes to repetitive tasks, you’re better of automating them. This article will teach you how.

After reading, you’ll know how to automate the execution of two Python scripts for fetching, parsing, and saving data from the web. Let’s get started!

The article is structured as follows:

  • What is Cron?
  • Writing the Scripts
  • Editing Crontab File
  • Testing
  • MacOS Gotchas
  • Conclusion

What is Cron?

Think of Cron as one of the easiest ways to schedule tasks in Linux and macOS environments. The word “Cron” comes from the Greek word “Chronos” (time), and the word “Crontab” stands for “Cron table” or time table. You’ll learn in a bit what this table refers to.

You should use Cron any time you want to automate something, like an OS job or a Python script. Needless to say, but an automated Python script can do basically anything.

On Linux and macOS, the Crontab consists of six fields. The first five are reserved for the date and time of scheduled execution (minute, day of month, month of year, day of week), and the last field is reserved for a command to be executed.

You’re free to use asterisks, values, and ranges for the date-time fields, but more on that in a bit.

You now know what Cron and Crontab are, but we’ll still need some Python scripts before working on scheduling. Let’s cover them next.

Writing the Scripts

Today we’ll schedule two simple scripts. Their job is to fetch the data from the following dummy websites:

These sites contain dummy data on various subjects, but we’ll focus only on the users and posts. The only reason we’re handling two sites is to show how to schedule cron jobs at different time intervals.

Источник

Run python script cron

Запускаем Python-скрипт с помощью Cron на Linux

Я, как настоящий старовер, решил построить «data-pipeline» без коннекторов и DAG-менеджеров. Положив два перста на мышку, началась упорная работа. Разобрался с API рекламных систем, установил драйвер bigquery, залил первую таблицу в датасет. Победа была близка, осталось всё автоматизировать. Я начал разворачивать Airflow, а потом проснулся и вспомнил про cron.

Читайте также:  Uploading html files перевод

Вспомнив про ранее купленный на лучшемгосподихостинге бегете VPS, куда я деплоил свой tf-idf кластеризатор. Было решено залить скрипт на сервер и настроить его запуск на 6 утра ежедневно.

Cron — это демон, а демон — это программа работающая в фоновом режиме. Ну а если вы программировали на Python — вам должны быть знакомы процессы-демоны. Запуск Cron-задания — это легко, но только в случаях когда мы говорим об выполнении php и bash скриптов. С Python всё иначе.

Устанавливаем Python на сервер

Выполняем, указные команды на примере Ubuntu.

sudo apt update sudo apt install python3.8 sudo apt install -y python3-pip

Проверяем успешность установки командой python3.

Создаем виртуальное окружение virtalenv

Следующий шаг — изолировать наш проект в отдельное виртуальное окружение, куда мы будем устанавливать нужные нам библиотеки.

pip3 install virtualenv # устанавливаем библиотеку cd /home/iakulshin # идем в папку вашего пользователя, тут на ваше усмотрение mkdir pipeline # создаем папку проекта cd /pipeline # переходим в папку virtualenv -p python3 venv # создаем виртуальное окружение, важно что мы устаналиваем с параметром -p, а то получим python 2.7 source venv/bin/activate # активируем 

Теперь мы видим рядом в консоли перед строкой приписку (venv) — это значит, что мы в виртуальном окружении.

создание venv python linux

Запуск Python-скрипта с помощью Сron

Давай потестируем то, что у нас получилось на маленьком скрипте, который будет писать в файл дату и время его активации. Таким образом мы проверим как работает cron. Тестовый скрипт, который мы положим в корень папки проекта, у меня это / home / iakulshin / pipeline, заливаем через файловый менеджер filezilla и прочие, если вы хардкорный девопс-дата-инженер удачи вам с nano. Заливаем скрипт указанный ниже в нашу папку.

from datetime import datetime with open('test.txt', 'a+', encoding='utf-8') as file: file.write(datetime.today().strftime('%Y-%m-%d-%H-%M-%S') + '\n')

Давайте попробуем создать cron задание для тестового запуска. В целом нам будут нужны 2 команды:

crontab -l # выводит список текущих заданий crontab -e # открывает файл заданий crontab -r # удаляет файл задания Пишем в консоль crontab -e

Появлеятся файлик с крон задачами в редакторе nano. Наша задача установить задание, которое будет запускать наш скрипт каждую минуту.

* * * * * cd /home/iakulshin/pipeline && /home/iakulshin/pipeline/venv/bin/python3 test.py [минута] [час] [день] [месяц] [день недели] [Переходим в папку] [&& - означает "и"] [с помощью интерпретатора python3 запускаем файл test.py]

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

Как понять что Cron срабатывает?

Чтобы удостовериться, что cron-таск отрабатывает, нам необходимо добавить задачу и обратиться к логам сервера, для этого идем в консоль и пишем следующую команду:

tail /var/log/syslog # получаем "хвост", последние 10 строк лог-файла

как понять что cron сработала

В нем вы увидите следующие записи:

Это означает, что cron срабатывает и воспроизводит команду, которую вы указали после звездочек. Но что делать, если python-скрипт всё еще не работает?

Читайте также:  Python normal distribution pdf

Cron срабатывает но Python-скрипт не выполняется

Самая типичная проблема, которая связана с «холостым» крон-таском — это недоступность библиотек, неверный выбор virtual env и версии python. Способ выбранный выше — это способ к которому я пришел спустя десяток часов поисков и изучения stackoverflow. Что нужно проверить для успешного запуска скрипта:

Возьмите команду, которую собирались добавь в крон и запустите её, это поможет словить ошибки связанные с недоступностью библиотек. В моем случае Скрипт не видел импортируемый файл, это я вылечил добавлением папки в системный путь. Добавляем в скрипты следующий код:

#!/home/iakulshin/bq_uploader/venv/bin/python import sys sys.path.insert(1, '/home/iakulshin/bq_uploader/') # Путь до вашей папки со скриптом

Если скрипт запускается по прямой команде из консоли, но cron всё еще не выполняется, то ошибка 100% в том, что ваш скрипт запускается не из под virtualenv или вы запускаете скрипт из под python не подходящей версии, поэтому проверяем следующее:

  1. Мы перешли в папку со скриптом командой cd
  2. Мы обратились к интерпретатору python3 находящемуся в папке с виртуальным окружением нашего проекта.

В целом данный гайд должен помочь вам разобраться с запуском Python скриптов с помощью Cron. Однако, я оставлю ссылки на полезные треды в stackoverflow, где представлены дополнительные способы решения этой проблемы.

Источник

Код на python, сервер и Cron. Запускаем код на сервере по времени

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

Решение я разбил на 2 части:

В этой статье мы рассмотрим реализацию 2-го пункта. Если у вас нет 2 пункта подойдет любой другой код, которые требуется запускать по расписанию.

На схеме это будет выглядеть следующим образом.

Код на python публикуем на сервер через github, устанавливаем docker. В crontab задаем интервал для запуска docker контейнера

Подготавливаем данные для Docker

Про Docker написано очень много статей, поэтому я не буду писать еще раз, что это и для чего используется. В контексте данной статьи Docker будет частью нашего решения. В следующем разделе будет ссылка на материал по теме Docker, который помог мне.

* noted-point файл с расширением json, который используется в коде на python

  1. Создаем файл requrements.txt
  2. Настраиваем Dockerfile
  3. Настраиваем переменное окружение в коде python
  4. Оставляем словарь, который использует google sheet api*

requrements.txt

В папке с вашим кодом создаем файл с точно таким же именем requrements.txt Этим файлом мы говорим Docker, какие библиотеки нужно дополнительно установить и какой версии.

Как понять, что туда написать?

Обязательно вносим в файл библиотеки, которые вы устанавливали дополнительно. В моем случае все библиотеки, которые использованы в коде в самом начале.

import os import requests from pandas import json_normalize import pandas as pd from datetime import datetime from datetime import * import httplib2 from oauth2client.service_account import ServiceAccountCredentials import apiclient.discovery

В IDE в консоле пишем pip freeze.
Видим список всех установленных пакетов в вашем виртуальном окружение и их версии

Читайте также:  Java opera mini for samsung

Пример вывода списка библиотек с и их версии

Выбираем библиотеки, которые мы с вами используем в коде и переносим в requrements.txt

На выходе это будет выглядеть так:

Наполнение файла requrements.txt

Dockerfile

заполненная структура докер файла

Создаем файл Dockerfile, без расширения. Открываем его и заносим данные

FROM python: «ваша версия python». Узнать ее можно набрав в терминале: python –V

Подробно останавливаться на всем не буду. Выше собранный requrements.txt будет использован в RUN.

ENV это переменное окружение, которые будут храниться внутри Docker. ENV TZ Europe/Moscow – установление московского времени.

Все остальные переменные необходимы для корректной работы кода. (см. статью https://habr.com/ru/post/720862/)

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

CMD указываем язык программирования и названия вашего файла с кодом в моем случае это vk_stat.py

Настраиваем переменное окружение в коде python

Мы удаляем значение переменных из кода, так как они у нас уже в Dockerfile.
Прописываем команду, которая будет забирать переменные окружения.

TOKEN_USER = os.getenv('TOKEN_USER') VERSION = os.getenv('VERSION') DOMAIN = os.getenv('DOMAIN')

Создаем сервер, публикуем код на GitHub

Я бы посоветовал прежде, чем перейти к этому шагу скачать отдельно docker desktop и провести тестирование на вашей локальной машине.

В этом видео вы найдете все что нужно по установки docker и кратко для чего он применяется. Мне данное видео очень помогло. https://www.youtube.com/watch?v=QF4ZF857m44

Для тех кто c Docker знаком предлагаю просмотреть фрагмент видео (ссылка выше) с 1:05:23 по 1:10:17

Добавлю лишь, если вы не хотите прописывать переменные внутри сервера, то сделайте закрытый репозиторий на GitHub!

Здесь не вижу смысла перечислять все шаги, если вы повторите за автором видео.

90% работы вами уже сделано. По итогам у вас:

— Создан сервер с опубликованном кодом через github + установленный docker

Отладка Cron

Далее через командную строку заходим на наш сервер.

Мне понравилась статья про cron здесь https://losst.pro/nastrojka-cron, но далее кратко напишу по сути. Набираем «crontab –e» в командной строке.

В самом конце набираем интервал для запуска контейнер. В моем случае каждый час. В помощь хороший сайт, который позволит сразу настроить интервал https://crontab.guru

Далее пишем команду Docker run –rm «имя вашего образа». Флажок –rm удаляет контейнер после его отработки. Не забываем сохранить наши изменения.

Cron перед сохранением. test - имя моего образа

Проверить, не падает ли контейнер при запуске можно в логах. Введите команду grep CRON /var/log/syslog

Заключение

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

Сервер обходиться в 200 рублей за месяц аренды. Работать код будет 4-6 месяцев. Если у кого-то есть решение, как можно сделать тоже самое без использования сервера, будет интересно почитать.

Источник

Оцените статью