LINUX.ORG.RU

python-скрипт не запускается в cron?

 ,


0

3

Написал скриптик, написал bash-файл для его запуска (он уже давно был, запускал другое, а я вписал туда запуск питон-скрипта). Не работает из крона. Вопрос - почему?

#!/bin/bash


curdate=`date`;
echo "(26 region)________________________________________________________________________________________" #>> /var/log/as.log;
echo "$curdate" #>> /var/log/as.log;
echo "" #>> /var/log/as.log;

python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py #>> /var/log/as.log

когда я запускаю из-под рута python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py #>> /var/log/as.log, то он прекрасно отрабатывает.

★★★★★

Последнее исправление: bvn13 (всего исправлений: 1)

Это вообще валидный оператор «#>>»? В мане баша не нашел его. Скорее всего все после # воспринимается башем как комментарий.

Smola
()
Последнее исправление: Smola (всего исправлений: 1)
Ответ на: комментарий от zolden

ну.... а как питон прописать туда? и если я от рута вполне преспокойно запускаю интерпретатор...

# echo $PATH
/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games

# python3
Python 3.3.5 (default, Mar 27 2014, 17:16:46) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
>>>
bvn13 ★★★★★
() автор топика
Ответ на: комментарий от zolden

в кроне написал щас:

export PYTHONPATH=/usr/bin/python3 && export PATH=$PATH:/usr/lib/python3 && python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py >> /var/log/as_py.log

и при запуске файл лога создается но пустой. хотя мой скрипт в норме пишет тонну инфы в stdout

что еще может быть?

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Пиши в кронтаб:

...
SHELL=/bin/bash
PATH=...
PYTHONPATH=...
...
cron сам экспортирует эти переменные в процесс выполняемой команды.
До указания PATH=... $PATH в cron'е пустой, имей в виду.

pS
()
Последнее исправление: pS (всего исправлений: 1)

Нафига нужна обёртка на баше, если все её функции можно добавить в питоноскрипт?

Axon ★★★★★
()
Ответ на: комментарий от pS
SHELL=/bin/bash
PYTHONPATH=/usr/bin/python3
PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/lib
MAILTO=root

13 06 * * * export PYTHONPATH=/usr/bin/python3 && export PATH=$PATH:/usr/lib/python3 && /usr/bin/python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py >> /var/log/as_py.log

вот так делаю. Пусто в файле. Хоть убей. Но файл создается.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

export PYTHONPATH=/usr/bin/python3 && export PATH=$PATH:/usr/lib/python3 && второй раз не нужно уже. Добавь всё нужно в уже указанные переменные.

И может писать в файл лучше средствами самого питона?

Radjah ★★★★★
()
Последнее исправление: Radjah (всего исправлений: 1)
Ответ на: комментарий от Radjah

Предполагается, что питоноскрипт может запускаться и вручную, чтобы глянуть, что там такое изменилось, почему сейчас не грузит данные в БД

В общем, такой вариант есть, но в данный момент он костыльный.

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Ответ на: комментарий от ArcFi

да, помогло. Теперь есть хотя бы трейсбэк...

# cat as.log
Traceback (most recent call last):
  File "/srv/www/vhosts/as/demons/py/as_loader/as_loader.py", line 18, in <module>
    main();
  File "/srv/www/vhosts/as/demons/py/as_loader/as_loader.py", line 12, in main
    updater.update()
  File "/srv/www/vhosts/as/demons/py/as_loader/astorage/updater.py", line 315, in update
    print ("%s" % (files))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 40-53: ordinal not in range(128)

теперь другой вопрос: почему питон не может print?

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

а почему бы и нет? если синтаксис это позволяет (в отличие от баша), то мне так удобней.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

от крона другое окружение, и там stdout не юникодный ни разу

Похоже на то:

$ LANG="C" python3 <<< 'print("Привет, Мир!")'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

$ LANG="en_US.UTF-8" python3 <<< 'print("Привет, Мир!")'
Привет, Мир!

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

Вместо

13 06 * * * export PYTHONPATH=/usr/bin/python3 && export PATH=$PATH:/usr/lib/python3 && /usr/bin/python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py >> /var/log/as_py.log

13 06 * * * /usr/bin/python3 /srv/www/vhosts/as/demons/py/as_loader/as_loader.py >> /var/log/as_py.log

Именно так пробовал?

Про это Radjah писал уже.

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

я все варианты препробовал... и тот, что Radjah говорил, и инитить PATH в самом начале крона (до расписания). Но смысл был в том, что питоноскрипт вываливал ошибку в stderr, а python3 script >> log не ловил ее, хотя ЕМНИП должен перехватывать оба потока (stdout, stderr). И меня это сбило с толку.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от pS

а, я не отписался о решении :)

сорри. Да, конструкция 2>&1 заставила вывести ошибки питоноскрипта в лог. Там оказалось не юникодное окружение. В итоге я совместил (отсюда) LANG="en_US.UTF-8" с прикручиванием логгера logger в самом питоноскрипте. И уже средствами питона (как мне и посоветовали в самом начале треда, но мне было инетересно понять первопричину) я вывожу в лог (и опционально, сделал параметрами к скрипту, - в тот же stdout, но уже не через print).

Тему закрываю как решенную.

Спасибо, друзья, за помощь!

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Сорри, тоже невнимательно прочитал конец треда, не увидел, что всё на пальцах.

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