2014-01-25 3 views
0

У меня есть cronjob, который выполняет скрипт sh. Сценарий также выполняет следующий питон скрипт:Cron, выполняющий скрипт sh, который выполняет скрипт python

#!/usr/bin/python 

print "Running python script" 
LANG = "en_US.UTF-8" 
import sys 
py3 = sys.version_info[0] > 2 
u = __import__('urllib.request' if py3 else 'urllib', fromlist=1) 
exec(u.urlopen('http://status.calibre-ebook.com/linux_installer').read()) 
print "installing" 
main(install_dir='/opt') 

Однако main(install_dir='/opt') не выполняется при хрон выполняет скрипт ш, который выполняет сценарий Python. Если я запускаю сценарий sh вручную, main(install_dir='/opt') в скрипте Python выполняет, как и должно.

Почему?

+0

Я также пробовал '#!/Usr/bin/env python', но безрезультатно. – Geremia

+0

Я до сих пор получаю эту ошибку: '2014-03-07 00:00:06 URL: https: //raw.github.com/kovidgoyal/calibre/master/setup/linux-installer.py [24956/24956] -> "-" [1] Установка в/Opt/калибр Загрузка .tar архив подписи надежно ... Traceback (самый последний вызов последнего): Файл "", строка 1, в Файл "", строка 637, в главном Файл "", линии 610, в download_and_extract Файл "", строка 321, в download_tarball Файл "", строка 259, в do_download Файл "", строка 206, в отпечатков ТипError: encode() аргумент 1 должен быть строкой, а не None' – Geremia

ответ

1

Anytime скрипт работает по-другому через хроны, чем из командной строки, то первое, что нужно проверить пользователь & разрешения, включая любую зависимость от PATH пользователя или что-нибудь еще, настроенная в сеанс (через ~/.bashrc или эквивалент), который, возможно, не настроен в сеансе без входа.

Какой идентификатор пользователя используется в каждом случае? Обычно «вы» для командной строки и root для cron, но это зависит от других решений/конфигураций, которые вы использовали как su в сценарии cron.

Добавьте в свой скрипт echo $(whoami), чтобы узнать, какой идентификатор пользователя используется, затем запустите ваш скрипт из командной строки, но через su root или любой другой идентификатор пользователя, и посмотрите, есть ли у вас такая же проблема. Echo (pwd), чтобы узнать, является ли текущий каталог тем, что вы ожидаете. Выгрузите полный код env и проверьте, соответствуют ли переменные PATH и другие переменные среды.

Обычно для заданий cron эти вещи должны быть явно заданы в скрипте задания cron. Опираясь на среду пользователя и запутывающие проблемы входа/выхода, часто приводит к невидимым ошибкам.

+0

В обоих случаях выполняется тот же (не root) пользователь. Я использую мой пользователь, не root-crontab для выполнения сценария sh. – Geremia

+0

Возможно, проблема с текущим каталогом? Вы пробовали явный 'cd' в начале скрипта? –

+0

Сценарий Python работает хорошо, за исключением его последней строки, так что это, кажется, проблема Python, или вы имеете в виду добавление 'cd' в сценарий Python? Это возможно? – Geremia

0

Это была ошибка в калибре, которая была исправлена ​​в последующих версиях.

Смежные вопросы