- Execute Python script via crontab
- Код на python, сервер и Cron. Запускаем код на сервере по времени
- Подготавливаем данные для Docker
- requrements.txt
- Dockerfile
- Настраиваем переменное окружение в коде python
- Создаем сервер, публикуем код на GitHub
- Отладка Cron
- Заключение
- Как запустить скрипты python через cron на Linux
- Подготовка сервера
- Подготовка файла
- Добавление в cron
- Возможные ошибки
- Читайте также
Execute Python script via crontab
I’m trying to execute a Python script using the Linux crontab. I want to run this script every 10 minutes. I found a lot of solutions and none of them worked. For example: edit the anacron at /etc/cron.d or use crontab -e . I put this line at the end of the file, but it doesn’t change anything. Do I have to restart any service(s)?
*/2 * * * * /usr/bin/python /home/souza/Documets/Listener/listener.py
#!/usr/bin/python # -*- coding: iso-8859-15 -*- import json import os import pycurl import sys import cStringIO if __name__ == "__main__": name_server_standart = "Server created by script %d" json_file_standart = " < \"server\" : < \"name\" : \"%s\", \"imageRef\" : \"%s\", \"flavorRef\" : \"%s\" >>" curl_auth_token = pycurl.Curl() gettoken = cStringIO.StringIO() curl_auth_token.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1") curl_auth_token.setopt(pycurl.POST, 1) curl_auth_token.setopt(pycurl.HTTPHEADER, ["X-Auth-User: cpca", "X-Auth-Key: 438ac2d9-689f-4c50-9d00-c2883cfd38d0"]) curl_auth_token.setopt(pycurl.HEADERFUNCTION, gettoken.write) curl_auth_token.perform() chg = gettoken.getvalue() auth_token = chg[chg.find("X-Auth-Token: ")+len("X-Auth-Token: ") : chg.find("X-Server-Management-Url:")-1] token = "X-Auth-Token: ".format(auth_token) curl_auth_token.close() #---------------------------- getter = cStringIO.StringIO() curl_hab_image = pycurl.Curl() curl_hab_image.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7") curl_hab_image.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque curl_hab_image.setopt(pycurl.HTTPHEADER, [token]) curl_hab_image.setopt(pycurl.WRITEFUNCTION, getter.write) #curl_list.setopt(pycurl.VERBOSE, 1) curl_hab_image.perform() curl_hab_image.close() getter = cStringIO.StringIO() curl_list = pycurl.Curl() curl_list.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers/detail") curl_list.setopt(pycurl.HTTPGET, 1) #tirei essa linha e funcionou, nao sei porque curl_list.setopt(pycurl.HTTPHEADER, [token]) curl_list.setopt(pycurl.WRITEFUNCTION, getter.write) #curl_list.setopt(pycurl.VERBOSE, 1) curl_list.perform() curl_list.close() #---------------------------- resp = getter.getvalue() con = int(resp.count("status")) s = json.loads(resp) lst = [] for i in range(con): lst.append(s['servers'][i]['status']) for j in range(len(lst)): actual = lst.pop() print actual if actual != "ACTIVE" and actual != "BUILD" and actual != "REBOOT" and actual != "RESIZE": print "Entra no If" f = file('counter', 'r+w') num = 0 for line in f: num = line content = int(num)+1 ins = str(content) f.seek(0) f.write(ins) f.truncate() f.close() print "Contador" json_file = file('json_file_create_server.json','r+w') name_server_final = name_server_standart % content path_to_image = "http://192.168.100.241:8774/v1.1/nuvemcpca/images/7" path_to_flavor = "http://192.168.100.241:8774/v1.1/nuvemcpca/flavors/1" new_json_file_content = json_file_standart % (name_server_final, path_to_image, path_to_flavor) json_file.seek(0) json_file.write(new_json_file_content) json_file.truncate() json_file.close() print "Json File" fil = file("json_file_create_server.json") siz = os.path.getsize("json_file_create_server.json") cont_size = "Content-Length: %d" % siz cont_type = "Content-Type: application/json" accept = "Accept: application/json" c_create_servers = pycurl.Curl() logger = cStringIO.StringIO() c_create_servers.setopt(pycurl.URL, "http://192.168.100.241:8774/v1.1/nuvemcpca/servers") c_create_servers.setopt(pycurl.HTTPHEADER, [token, cont_type, accept, cont_size]) c_create_servers.setopt(pycurl.POST, 1) c_create_servers.setopt(pycurl.INFILE, fil) c_create_servers.setopt(pycurl.INFILESIZE, siz) c_create_servers.setopt(pycurl.WRITEFUNCTION, logger.write) print "Teste perform" c_create_servers.perform() print logger.getvalue() c_create_servers.close()
Код на python, сервер и Cron. Запускаем код на сервере по времени
У меня была задача «Собирать статистику постов в vk каждый час». Я не являюсь разработчиком или DevOps специалистом. Поэтому мой способ решения задачи сложился из поисковых запросов, личного опыта, советов друзей и коллег.
Решение я разбил на 2 части:
В этой статье мы рассмотрим реализацию 2-го пункта. Если у вас нет 2 пункта подойдет любой другой код, которые требуется запускать по расписанию.
На схеме это будет выглядеть следующим образом.
Подготавливаем данные для Docker
Про Docker написано очень много статей, поэтому я не буду писать еще раз, что это и для чего используется. В контексте данной статьи Docker будет частью нашего решения. В следующем разделе будет ссылка на материал по теме Docker, который помог мне.
- Создаем файл requrements.txt
- Настраиваем Dockerfile
- Настраиваем переменное окружение в коде python
- Оставляем словарь, который использует 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.
Видим список всех установленных пакетов в вашем виртуальном окружение и их версии
Выбираем библиотеки, которые мы с вами используем в коде и переносим в 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 удаляет контейнер после его отработки. Не забываем сохранить наши изменения.
Проверить, не падает ли контейнер при запуске можно в логах. Введите команду grep CRON /var/log/syslog
Заключение
Данное решение позволяет выполнить поставленную задачу. Конечно его можно улучшить. Например, добавить логирование, написать класс и завернуть все в функции что позволит в будущем расширять функционал. Возможно радикально пересмотреть в целом предлагаемое мной решение.
Сервер обходиться в 200 рублей за месяц аренды. Работать код будет 4-6 месяцев. Если у кого-то есть решение, как можно сделать тоже самое без использования сервера, будет интересно почитать.
Как запустить скрипты python через cron на Linux
Admin 17.12.2020 , обновлено: 22.12.2020 Linux
Описание процесса запуска скриптов python на сервере Linux.
Альтернативы cron на python — timer или периодические задачи (celery).
Подготовка сервера
Сервер должен быть сконфигурирован для работы с python. Повторю основное из статьи по ссылке.
На сервере должны быть установлены пакеты для python:
Установлен пакет python3-venv:
Положить файлы в требуемую директорию и создать там виртуальную среду:
Подготовка файла
В верху файла python добавить строку ведущую к виртуальному окружению python:
Если нужны зависимости (модули) к файлу их можно отдельно установить через файл requirements.txt.
Добавление в cron
А если мы вошли в качестве другого пользователя, то создадим сначала ему кронтаб:
Будет предложено какой редактор использовать для просмотра кронов. Пропустите это сначала и посмотрите где находится nano (если конечно предпочтение отдается ему):
А затем указывая его путь установим редактор по умолчанию:
Строка состоит из: время запуска / скрипт запуска / лог запуска (если ошибок не будет, он будет пустым, если специально туда ничего не выводить).
Возможные ошибки
Не видится путь к модулям. Используйте эту статью.
Читайте также
У сайта нет цели самоокупаться, поэтому на сайте нет рекламы. Но если вам пригодилась информация, можете лайкнуть страницу, оставить комментарий или отправить мне подарок на чашечку кофе.