LINUX.ORG.RU

не работает python-скрипт v.3 через cron в Centos 6.9

 , ,


0

3

Нужен был парсер дампа в xml. Нашел вариант на python 3. По умолчанию в Centos 6 установлен 2-й питон, по совету той же Хабры установил менеджер pyenv для рута и для себя (oleg) и питон 3.6.1. В итоге: при запуске вручную "./rkn.sh" - работает. Но крон не хочет запускать. Пробовал из /home под своим именем и под рутом. Права на каталоги принадлежат соответственно руту, или мне. "...." - там еще обычные команды для баша: cp, rm, scp, которые отрабатываются. Для rkn.sh и rkn.py применял команду: chmod +x rkn.*
Скрипт rkn.sh:
#!/usr/bin/env bash
export LANG=ru_RU.UTF-8
....
wait
python rkn.py
....
exit 0

задание cron:
*/15 * * * * oleg /opt/rkn/rkn.sh > /dev/null 2>&1
*/15 * * * * root /opt/rkn/rkn.sh > /dev/null 2>&1

в питоновский файл потом еще добавил:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-

Прошу прощения, если не сумел правильно изложить суть вопроса и оформить заголовок темы.

Oleg_hit ()

1. Добавь строчку PYTHONIOENCODING=utf8 в самый верх кронтаба

2. python /opt/rkn/rkn.py

3. Сделай вывод не в /dev/null, а в файл и посмотри, что там пишется.

panter_dsd ★★★★ ()

Добавлю к вышеперечисленному: попробуй в rkn.sh указать полный путь к интерпретатору и полный путь к скрипту, примерно так:

/usr/bin/python3 /opt/rkn/rkn.py 

grazor ()
Ответ на: комментарий от grazor

Дело в том, что такого файла там не существует. Pyenv ставится в домашний каталог. Устанавливал сначала для рута, потом для себя, по другому не получалось. Ставится в /root/.pyenv/versions/3.6.1/bin/python3 и /home/oleg/.pyenv/versions/3.6.1/bin/python3. Пробовал прописывать в задании крона эти пути, но не выходило ничего.

Oleg_hit ()
Ответ на: комментарий от panter_dsd

Я, сразу извиняюсь, опыта у меня мало.
Строчку 1. куда добавить:

  • /etc/crontab
  • /var/spool/cron/root.

    сделал вывод в файл. Выводит то, что я задал выводить в консоль при запуске. Но тот вывод инфы, которую должен выводить rkn.py - нету. Получается команда не отрабатывается. В rkn.sh прописал:
    /root/.pyenv/versions/3.6.1/bin/python3 /opt/rkn/rkn.sh
    попробовал вручную - работает.

Oleg_hit ()
Ответ на: комментарий от Oleg_hit

Pyenv ставится в домашний каталог. Устанавливал сначала для рута, потом для себя

А как крон должен узнать, каким питоном запускать скрипт? Для каждого случая нужно вызывать скрипт именно тем интерпретатором, которым нужно — либо два разных скрипта, либо передавать аргументом, либо предварительно интерпретатор в $HOME (для рута это станет /root, для юзера — /home/oleg/).

Команда тогда будет выглядеть примерно так:

${HOME}/.pyenv/versions/3.6.1/bin/python3 /opt/rkn/rkn.py 

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

В rkn.sh прописал:
/root/.pyenv/versions/3.6.1/bin/python3 /opt/rkn/rkn.sh

Там же .py скрипт должен быть.

grazor ()
Ответ на: комментарий от grazor

В общем, я решил проблему, следуя поговорке «задавая вопрос ты уже на половину знаешь ответ». Есть горе-советчики, как раз с этого форума один такой советовал не засорять систему устанавливая пакеты питона, а поставить этот pyenv. Для чисто разработки на питоне может этот вариант и лучше, но не для сисадмина, т.к. цель автоматизация задач через крон посредством таких скриптов. Так пусть питон будет установлен как положено, а не в вирт. окружениях, ИМХО.
В системе установлено: группа «Development tools», python34.i686, python34.x86_64, python34-tools.x86_64, python34-devel.x86_64. Возможно что-то из списка лишнее - но это оставляю выяснять другим, у меня работает. /etc/crontab:

PYTHONIOENCODING=utf8
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

Задание для /var/spool/cron/root:

30 */1 * * * /opt/rkn/rkn.sh >> /opt/rkn/log/parser.log

Задание для /var/spool/cron/oleg - для копирования на др сервер:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/bin
MAILTO=oleg
HOME=/
45 */1 * * * /home/oleg/rkn.sh >> /home/oleg/rkn_copy.log

В домашнем каталоге положил rkn.sh, который только копирует на др сервак командой scp, но почему-то сразу не хотел работать. C ним пришлось опять эксперементировать. Текст /opt/rkn.sh и ~/rkn.sh:

#!/usr/bin/env bash
# -*- Create by Oleg -*-
export LANG=ru_RU.UTF-8
/usr/bin/python3 /opt/rkn/parser.py
wait
exit 0

К обоим скриптам «sh» командой «chmod +x имя_скрипта» дал права на запуск. Еще скрипт в дом. каталоге стал запускаться когда перезагрузил «крон»: /etc/init.d/crond restart
Касаемо вывода ошибок. Крон не выводил в /var/log/cron, а вывод ошибок запуска и исполнения скрпита выводился в /var/spool/mail/root или /var/spool/mail/oleg.
Кстати, в скриптах, я повторюсь за другими, надо прописывать полные пути.

Oleg_hit ()

Может кому надо - команда копирования на др. сервер по SSH:

scp /opt/rkn/lists/name.txt oleg@ip_server:/home/oleg/

Только не забываем делать пару SSH-ключей и проверочное подключение. И на заметку: при запуске скрипта от имени «root», данной командой, то скрипт автоматически не будет отрабатывать. У меня в настройках SSH отключено удаленное подключение рута, оставил подключение по паролю, по ключам. В итоге при запуске по крону - у меня каждый раз был запрос пароля.

Oleg_hit ()
Ответ на: комментарий от Oleg_hit

pyenv

это нужно не только для разных версий питона, но и для того чтобы наборы пакетов для разных задач держать в разных окружениях, ну и как бонус, чтобы в окружение ставить пакеты с помощью pip не нужен sudo. Кстати бинарник питона который используется внутри окружения, внезапно, обычно можно там и найти. Сейчас не за линуксом, так что ЕМНИП в папке <окружение>/bin. Собственно им и можно запускать.

Dred ★★★★★ ()

Еще остался вопрос касаемо загрузки ЦПУ, когда скрипт питона запускается, то загрузка 99-100% до окончания работы. Странно, обычно другие процессы много не жрут ресурсы ЦПУ, даже «тяжеловесный Firefox с своей чугунной броней:))» только до 70-80% грузит.
А так заканчиваю на этом. Последний вопрос: кто закрывает тему, я, или модераторы? И надо ли это)?

Oleg_hit ()
Ответ на: комментарий от Dred

Не хотелось бы заниматься флудом, а то обычно модераторы очень чувствительные люди. Но я может не совсем понятно изложил свою мысль, но повторюсь: pyenv нужен тем, кто занимается разработкой. Я прежде чем добавлять в «крон», я пробовал вручную, т.е. ./rkn.sh. И как только я не прописывал команду, в том числе указывал путь /home/oleg/.pyenv/versions/3.6.1/bin, где и находится бинарник питона и сокращал типа $HOME/.../bin - насколько хватало фантазии, но все бесмысленно, пока не поставил питон 3.4 из пакетов вместе с библиотеками. Потом что-то крон ерепенился и не хотел запускать отдельный скрипт отправки файлов на др. сервер. Вручную перезагрузил крон и заработало, а я уж хотел идти к местному «батьке» чтобы осветил серверную)).

Oleg_hit ()
Ответ на: комментарий от Dred

и да я читал, что этот «эмулятор» может легко переключать версии питона и даже для разных каталогов назначать свою версию. ИМХО, все это «танцы с бубнами» - переходить полностью на 3-ю версию и БАСТА.

Oleg_hit ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.