Linux cron script python

How To Schedule Python Scripts As Cron Jobs With Crontab (Mac/Linux)

In this tutorial, we learn about cron jobs and how to schedule commands and Python scripts in the terminal via crontab (for Linux and Mac). This allows us to run commands on a repetitive schedule. We specifically look into running Python scripts as cron jobs. There are a couple of pitfalls where we have to be careful. We also learn how to schedule jobs with a virtual environment.

The code is also available on GitHub.

Crontab¶

We can schedule jobs with the crontab command. A crontab file is a simple text file containing a list of commands meant to be run at specified times. It is edited using the crontab command. The commands in the crontab file are checked by the cron daemon, which executes them in the system background.

List all scheduled cron jobs with:

Edit the file by using the command:

Then use the following syntax to schedule a job

For example to run a python script use:

The syntax¶

To check the syntax I recommend to visit the free website crontab.guru.

The syntax is this: ‘minute hour day-of-month month day-of-week’

The 5 items are used to specify minute, hour, day in the month, month, and day in the week (in this order).

Allowed values are:

  • 0-59 for minute
  • 0-23 for hour
  • 1-31 for day-of-month
  • 1-12 for month
  • 0-6 for day-of-week (0 = Sunday)

The following characters can be used for more complex timing:

Some examples:

  • * * * * * : At every minute (every minute, every hour, every day, every month, every weekday)
  • 0 10 * * * : At 10:00 AM each day
  • 0 10 * * 0 : At 10:00 AM on each Monday
  • 0 0 1,15 * * At 00:00 on 1st and 15th each month
  • 0 0 * * 1-3 : At 00:00 from Monday through Wednesday
  • 0 0 1/2 * * : At 00:00 on every 2nd day from 1 through 31

Pitfalls when running Python scripts¶

\1. Use the full path to your file, e.g.:

\2. When logging into files, specify the full path for the filename in the Python file. Otherwise the file just ends up in your home directory.

\3. When a virtual environment is used, specify the full path to the python executable, e.g.:

FREE VS Code / PyCharm Extensions I Use

✅ Write cleaner code with Sourcery, instant refactoring suggestions: Link*

PySaaS: The Pure Python SaaS Starter Kit

🚀 Build a software business faster with pure Python: Link*

Читайте также:  Vmware workstation folder sharing linux

* These are affiliate link. By clicking on it you will not have any additional costs. Instead, you will support my project. Thank you! 🙏

Источник

Linux cron script python

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

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

Вспомнив про ранее купленный на лучшемгосподихостинге бегете 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 сработала

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

Читайте также:  Linux убрать атрибут исполняемый

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

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.
Видим список всех установленных пакетов в вашем виртуальном окружение и их версии

Читайте также:  Какие видеокарты поддерживает linux mint

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

Выбираем библиотеки, которые мы с вами используем в коде и переносим в 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 месяцев. Если у кого-то есть решение, как можно сделать тоже самое без использования сервера, будет интересно почитать.

Источник

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